Week08_시스템 보안

Week 08 · 1과목 시스템 보안

Day 1 · 운영체제 개념 · 보안 운영체제

1-1. 운영체제는 무엇을 하는가

운영체제(OS)는 하드웨어와 사용자(응용 프로그램) 사이의 관리자다. 식당에 비유하면 손님(응용 프로그램)은 주방(하드웨어)에 직접 들어가지 않고, 지배인(OS)에게 주문한다. 지배인은 누가 먼저 요리를 받을지(CPU 스케줄링), 테이블을 어떻게 나눌지(메모리 관리), 창고 물건을 누가 꺼낼 수 있는지(파일·접근 관리), 오븐·냉장고 같은 장비를 어떻게 돌릴지(장치 관리)를 정한다.

OS의 4대 자원 관리 기능

기능 하는 일 보안과의 연결
프로세스 관리 생성·종료·스케줄링·동기화 권한 상승, 레이스 컨디션
메모리 관리 할당·회수·가상 메모리·보호 버퍼 오버플로, ASLR, DEP
파일 관리 디렉터리, 권한, 소유권 SUID, World Writable
장치(I/O) 관리 드라이버, 인터럽트 커널 드라이버 루트킷

그 밖에 보호(Protection)·보안 기능, 네트워크 기능, 사용자 인터페이스 제공이 붙는다.

OS의 목적(성능 지표) 도 가끔 나온다.

1-2. 커널과 쉘

┌──────────────────────────────┐
│   사용자 / 응용 프로그램        │
├──────────────────────────────┤
│   쉘 (명령어 해석기)            │  ← bash, sh, csh, cmd, PowerShell
├──────────────────────────────┤
│   시스템 콜 인터페이스          │  ← open(), read(), fork() ...
├──────────────────────────────┤
│   커널 (Kernel)                │  ← 프로세스·메모리·파일·장치
├──────────────────────────────┤
│   하드웨어 (CPU·메모리·디스크)   │
└──────────────────────────────┘

사용자 모드 vs 커널 모드 (CPU 보호 링)

        Ring 0  커널 모드 (모든 명령 실행 가능)
       ┌──────────────┐
       │  Ring 1, 2   │  (장치 드라이버용, 대부분 OS는 미사용)
       │ ┌──────────┐ │
       │ │  Ring 3  │ │  사용자 모드 (특권 명령 불가)
       │ └──────────┘ │
       └──────────────┘

커널 구조 종류

구조 설명 예 보안 관점
단일형(Monolithic) 모든 기능이 커널 공간에 리눅스 빠르지만 드라이버 버그가 곧 커널 장악
마이크로커널 최소 기능만 커널, 나머지는 사용자 공간 서버 Mach, QNX, seL4 작아서 검증 쉬움(참조 모니터 사상과 비슷)
하이브리드 둘의 절충 Windows NT, macOS XNU —

1-3. 프로세스와 스레드

PCB에 들어있는 것: PID, 프로세스 상태, 프로그램 카운터(PC), 레지스터, 스케줄링 정보(우선순위), 메모리 관리 정보, 열린 파일 목록, 소유자(UID) 등.

프로세스 상태 전이

stateDiagram-v2
    state "생성 New" as New
    state "준비 Ready" as Ready
    state "실행 Running" as Running
    state "대기 Blocked" as Blocked
    state "종료 Exit" as Exit
    [*] --> New
    New --> Ready: 승인
    Ready --> Running: 디스패치
    Running --> Ready: 타임아웃
    Running --> Blocked: 입출력 요청
    Blocked --> Ready: 입출력 완료 wake up
    Running --> Exit: 종료
    Exit --> [*]

좀비·고아 프로세스

스케줄링 (간단히)

구분 알고리즘 특징
비선점 FCFS, SJF, HRN 실행 중이면 끝날 때까지
선점 RR(라운드로빈), SRT, 다단계 큐 시간 할당량·우선순위로 뺏음

HRN 우선순위 = (대기시간 + 서비스시간) / 서비스시간 — 기아(starvation)를 줄인다.

1-4. 메모리 관리 기초

프로세스 메모리 구조 (Day 2 버퍼 오버플로의 출발점이니 반드시 그릴 수 있어야 한다)

높은 주소 0xFFFFFFFF
┌─────────────────────┐
│ 커널 영역            │  사용자 접근 불가
├─────────────────────┤
│ 환경변수·argv        │
├─────────────────────┤
│ 스택 (Stack)         │  지역변수, 매개변수, RET
│        ↓ 아래로 자람   │
│                     │
│ (공유 라이브러리 mmap) │
│                     │
│        ↑ 위로 자람    │
│ 힙 (Heap)            │  malloc/new 동적 할당
├─────────────────────┤
│ BSS                 │  초기화 안 된 전역/static
├─────────────────────┤
│ Data                │  초기화된 전역/static
├─────────────────────┤
│ Text (Code)         │  기계어 코드, 읽기 전용
└─────────────────────┘
낮은 주소 0x00000000
영역 저장 내용 생성 시점 특징
Text 실행 코드 컴파일 읽기·실행, 쓰기 불가
Data int g = 10; 컴파일 읽기·쓰기
BSS int g; 컴파일 0으로 초기화
Heap malloc() 런타임 낮은→높은 주소
Stack 지역변수, RET, SFP 함수 호출 높은→낮은 주소, LIFO

가상 메모리: 실제 RAM보다 큰 주소 공간을 쓰는 기법. 필요한 부분만 RAM에, 나머지는 디스크(스왑)에.

페이지 교체 알고리즘

알고리즘 내쫓는 페이지
FIFO 가장 먼저 들어온 것 (벨레이디 모순 발생 가능)
OPT 앞으로 가장 오래 안 쓸 것 (이론상 최적, 구현 불가)
LRU 가장 오랫동안 안 쓴 것
LFU 사용 횟수가 가장 적은 것
NUR 최근 사용 안 한 것 (참조·변경 비트)

메모리 배치 전략: 최초 적합(First Fit) / 최적 적합(Best Fit, 가장 딱 맞는 빈 공간) / 최악 적합(Worst Fit, 가장 큰 빈 공간).

1-5. 보안 커널 · 참조 모니터 · TCB

"모든 출입은 반드시 경비실을 거친다"를 운영체제에 구현한 개념이다.

flowchart LR
    S["주체
사용자·프로세스"] -->|"접근 요청"| RM{"참조 모니터
(보안 커널)"} DB[("접근 규칙
보안 정책 DB")] --- RM RM -->|"허용"| O["객체
파일·장치·메모리"] RM -->|"거부"| X["차단"] RM --> L[("감사 로그")]

참조 모니터의 3대 조건

조건 의미 비유
완전 중재(Complete Mediation) 모든 접근이 예외 없이·매번 검사된다. 우회 경로 없음 뒷문 없는 건물
격리(Isolation) 참조 모니터 자체는 변조 불가(tamper-proof) 경비실은 잠겨 있다
검증 가능성(Verifiability) 작고 단순해서 올바름을 분석·테스트로 증명 가능 규칙서가 한 페이지

TCB 관련 용어

1-6. 보안 운영체제(Secure OS)

일반 OS는 DAC(임의적 접근통제, 소유자가 권한을 마음대로 부여)라서 root만 탈취하면 끝이다. 보안 운영체제는 커널에 보안 커널을 추가해 root조차 정책을 벗어날 수 없게 만든다.

보안 OS의 주요 기능

  1. 식별 및 인증 (강화된 인증)
  2. 강제적 접근통제(MAC) — 보안 레이블 기반
  3. 임의적 접근통제(DAC) 보완
  4. 객체 재사용 방지 — 반납된 메모리·디스크를 다음 사용자에게 주기 전 지움
  5. 완전한 중재, 안전한 경로
  6. 감사 및 감사 기록 축소
  7. 침입 탐지, 해킹 차단
  8. 최소 권한, root 권한 분할

SELinux (Security-Enhanced Linux, NSA 개발) — 리눅스 커널의 LSM(Linux Security Modules) 위에서 동작하는 MAC.

SELinux 3가지 모드

모드 정책 적용 로그 용도
Enforcing 위반 시 차단 기록 운영 (권장)
Permissive 차단 안 함 위반만 기록 정책 테스트·문제 해결
Disabled 완전 비활성 없음 비권장
$ getenforce
Enforcing
$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
$ ls -Z /var/www/html/index.html
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
$ setenforce 0        # 일시적으로 Permissive (재부팅 시 원복)
# 영구 설정: /etc/selinux/config 의 SELINUX=enforcing

AppArmor(우분투·SUSE): SELinux처럼 MAC이지만 경로(path) 기반 프로파일. 모드는 enforce / complain(=permissive와 유사).

1-7. 보안 평가 기준: TCSEC → ITSEC → CC

"이 OS·보안제품이 얼마나 믿을 만한가"를 등급으로 매기는 기준의 역사다.

flowchart LR
    T["TCSEC
1985 미국 국방부
오렌지북"] --> I["ITSEC
1991 유럽
영·독·프·네"] T --> CT["CTCPEC
캐나다"] I --> C["CC 공통평가기준
ISO/IEC 15408"] CT --> C T --> C

TCSEC (오렌지북) — 미 국방부, 기밀성 중심, 기능과 보증을 함께 평가

등급 이름 핵심
D 최소 보호 평가 탈락
C1 임의적 보안 보호 사용자 식별·인증, DAC
C2 통제된 접근 보호 개별 계정 책임, 감사(Audit), 객체 재사용 방지 — 일반 상용 OS 목표
B1 레이블된 보안 보호 보안 레이블 + MAC 시작
B2 구조화된 보호 정형 보안 모델, 은닉 채널(저장) 분석, 신뢰 경로
B3 보안 도메인 참조 모니터 요구, 보안 관리자 역할 분리
A1 검증된 설계 정형적(수학적) 검증

암기 팁: D → C(임의적, DAC) → B(강제적, MAC) → A(검증). C는 "Choice(소유자가 선택)", B는 "Label 붙임".

ITSEC (유럽)

CC (Common Criteria, 공통평가기준) — 국제 표준 ISO/IEC 15408, 우리나라도 CC 인증 운영.

EAL 이름 대략 대응 (TCSEC/ITSEC)
EAL1 기능 시험 —
EAL2 구조 시험 C1 / E1
EAL3 방법론적 시험·점검 C2 / E2
EAL4 방법론적 설계·시험·검토 B1 / E3
EAL5 준정형적 설계·시험 B2 / E4
EAL6 준정형적 검증된 설계·시험 B3 / E5
EAL7 정형적 검증된 설계·시험 A1 / E6

3기준 비교

구분 TCSEC ITSEC CC
지역 미국 유럽 국제(ISO)
중점 기밀성 기밀성·무결성·가용성 종합
기능/보증 통합 분리 분리 (PP·ST)
등급 D~A1 (7) E0~E6 EAL1~7

⚠️ 시험 함정 (Day 1)

기출 포인트 (Day 1)

확인 문제 (Day 1)

Q1. 참조 모니터(Reference Monitor)가 갖추어야 할 요건으로 옳지 않은 것은?
① 모든 접근 요청을 예외 없이 중재해야 한다 ② 자신이 변조되지 않도록 보호되어야 한다 ③ 높은 가용성을 위해 이중화되어야 한다 ④ 분석과 시험을 통해 올바름을 검증할 수 있을 만큼 작아야 한다

Q2. 보안 정책을 강제하는 데 관여하는 하드웨어, 펌웨어, 소프트웨어 보호 메커니즘 전체를 일컫는 용어는?
① 참조 모니터 ② 보안 커널 ③ TCB ④ 신뢰 경로

Q3. TCSEC 등급 중 보안 레이블을 이용한 강제적 접근통제(MAC)가 처음 요구되는 등급은?
① C1 ② C2 ③ B1 ④ A1

Q4. SELinux의 운영 모드에 대한 설명으로 옳은 것은?
① Enforcing 모드에서는 정책 위반을 기록만 하고 차단하지 않는다 ② Permissive 모드는 정책 위반을 차단하지 않고 로그만 남긴다 ③ setenforce 0 명령으로 Disabled 모드로 전환된다 ④ Disabled 모드에서도 AVC 거부 로그가 기록된다

Q5. CC(공통평가기준)에서 특정 제품 유형에 대해 구현과 독립적으로 사용자 요구 보안 사항을 정의한 문서는?
① ST ② PP ③ TOE ④ EAL

Q6. 프로세스 상태 전이에 대한 설명으로 옳지 않은 것은?
① 준비 → 실행 전이를 디스패치라 한다 ② 실행 중 할당 시간이 끝나면 준비 상태로 간다 ③ 입출력 요청 시 실행에서 대기 상태로 간다 ④ 입출력이 끝나면 대기 상태에서 곧바로 실행 상태로 간다


Day 2 · 메모리 공격 (★)

1과목에서 가장 자주, 가장 깊게 나오는 파트. 그림을 직접 그릴 수 있을 때까지 반복한다.

2-1. 함수 호출과 스택 프레임

버퍼 오버플로를 이해하려면 "함수를 호출하면 스택에 무엇이 쌓이는가"부터 알아야 한다.

main() 이 func(arg) 를 호출하면 (x86 32비트 기준, 개념 설명용):

  1. 인자(arg) 를 스택에 push
  2. call 명령: 돌아올 주소 = RET(Return Address) 를 push
  3. 함수 프롤로그: 이전 함수의 기준점 SFP(Saved Frame Pointer, 이전 EBP) 를 push, EBP를 현재 위치로
  4. 지역 변수(버퍼) 공간 확보 (ESP를 내림)
  5. 함수 종료(에필로그): leave; ret → 스택의 RET 값을 꺼내 그 주소로 점프

비유: RET는 "책갈피"다. 다른 책(함수)을 읽으러 가면서 원래 책에 꽂아 둔 책갈피. 누가 책갈피를 몰래 다른 페이지로 옮기면, 돌아왔을 때 엉뚱한 곳을 읽게 된다.

정상 스택 프레임

높은 주소
┌──────────────────┐
│ 함수 인자 (arg)    │
├──────────────────┤
│ RET (복귀 주소)    │ ← 함수 끝나면 여기로 점프
├──────────────────┤
│ SFP (이전 EBP)    │
├──────────────────┤  ← EBP
│ char buf[16]     │  buf[15]
│                  │   ...
│                  │  buf[0]  ← 쓰기는 여기서 시작해
└──────────────────┘          높은 주소 방향으로 진행
낮은 주소                ← ESP

핵심 포인트: 스택은 아래(낮은 주소)로 자라지만, 배열에 데이터를 쓰는 방향은 위(높은 주소)로 간다. 그래서 buf를 넘치게 쓰면 SFP → RET 순서로 덮인다.

2-2. 스택 버퍼 오버플로

취약 코드 예시 (교육용)

#include <string.h>

void vulnerable(char *input) {
    char buf[16];
    strcpy(buf, input);   /* 길이 검사 없음 → 취약 */
}

int main(int argc, char *argv[]) {
    if (argc > 1) vulnerable(argv[1]);
    return 0;
}

strcpy 는 원본 문자열의 끝(NULL)이 나올 때까지 무조건 복사한다. 목적지 크기를 모른다.

오버플로 전/후 비교

[정상 입력 "AAAA"]
┌──────────────────┐
│ arg              │
├──────────────────┤
│ RET = 0x08048456 │  정상 복귀 주소
├──────────────────┤
│ SFP              │
├──────────────────┤
│ buf: AAAA\0      │
└──────────────────┘

[과도한 입력 'A'x20 + 주소 4바이트]
┌──────────────────┐
│ arg              │
├──────────────────┤
│ RET = 공격자 주소  │ ★ 변조됨
├──────────────────┤
│ AAAA (SFP 덮임)   │
├──────────────────┤
│ AAAAAAAAAAAAAAAA │ buf 16B 가득
└──────────────────┘
→ 함수 종료 시 ret 이
  공격자가 지정한 곳으로 점프

공격 흐름 (개념)

  1. 공격자는 버퍼 크기 + SFP 크기만큼 채운 뒤 RET 위치에 원하는 주소를 넣는다.
  2. 그 주소는 보통 공격자가 메모리 어딘가(버퍼 자체, 환경변수 등)에 넣어 둔 쉘코드(쉘을 띄우는 기계어)의 위치.
  3. 대상 프로그램이 SUID root 라면 띄워진 쉘도 root 권한 → 권한 상승.
  4. 주소를 정확히 몰라도 되도록 쉘코드 앞을 NOP(0x90) 썰매(NOP sled) 로 채우는 기법이 알려져 있다.

그래서 SUID 파일 점검(Day 4)과 버퍼 오버플로는 한 세트다. 취약한 SUID root 프로그램 = root로 가는 문.

2-3. 힙 버퍼 오버플로

힙은 malloc() 으로 동적 할당되는 영역이다. 힙에는 RET가 없으므로 다른 것을 노린다.

힙 (낮은 → 높은 주소로 할당)
┌──────────┬──────────────┐
│ 청크A헤더 │ char name[32]│
├──────────┼──────────────┤
│ 청크B헤더 │ 함수포인터 fp │
└──────────┴──────────────┘
name 이 넘치면 → 청크B 헤더·fp 덮어씀
→ 나중에 fp() 호출 시 엉뚱한 곳 실행
비교 스택 BOF 힙 BOF
대상 영역 스택(지역변수) 힙(동적 할당)
주된 목표 RET, SFP 인접 데이터, 함수 포인터, 청크 메타데이터
난이도 상대적으로 쉬움 어려움(힙 구조 이해 필요)
대표 방어 Canary, Stack Shield 힙 메타데이터 무결성 검사, ASLR, DEP

2-4. 취약 함수 vs 안전 함수

취약 함수 문제 안전한 대안
strcpy(d, s) 길이 검사 없음 strncpy, strlcpy, strcpy_s
strcat(d, s) 길이 검사 없음 strncat, strlcat
gets(buf) 입력 길이 제한 불가 (C11에서 제거) fgets(buf, size, stdin)
sprintf 결과 길이 제한 없음 snprintf
scanf("%s") 길이 무제한 scanf("%15s", buf) (폭 지정)
vsprintf 동일 vsnprintf
getwd 버퍼 크기 미지정 getcwd(buf, size)

안전 코드 예시

#include <stdio.h>
#include <string.h>

void safer(const char *input) {
    char buf[16];
    /* 방법 1: strncpy - n바이트만 복사, NULL 종료 보장 안 됨 */
    strncpy(buf, input, sizeof(buf) - 1);
    buf[sizeof(buf) - 1] = '\0';          /* 직접 NULL 종료 */

    /* 방법 2: snprintf - 항상 NULL 종료 보장 */
    snprintf(buf, sizeof(buf), "%s", input);
}

void read_line(void) {
    char line[64];
    if (fgets(line, sizeof(line), stdin) != NULL) {   /* gets 대신 */
        line[strcspn(line, "\n")] = '\0';             /* 개행 제거 */
    }
}

⚠️ strncpy 는 원본이 n 이상이면 NULL 종료 문자를 붙이지 않는다. 그래서 마지막 바이트를 직접 '\0' 으로 채워야 한다. "strncpy를 쓰면 완벽히 안전"은 오답 포인트.

2-5. 방어 기법 ① 스택 보호: Canary · Stack Guard · Stack Shield

Stack Guard / 카나리(Canary)

┌──────────────────┐
│ RET              │
├──────────────────┤
│ SFP              │
├──────────────────┤
│ ★ CANARY ★       │ ← 리턴 직전 검사:
├──────────────────┤   원래 값과 같은가?
│ buf[16]          │
└──────────────────┘
넘치면 카나리부터 깨진다 → 종료
* 교재에 따라 "RET 앞"(SFP 포함 위치)로 그림

카나리 종류

종류 값 원리
Terminator 0x00(NULL), 0x0d(CR), 0x0a(LF), 0xff(EOF) 문자열 함수는 NULL·개행에서 복사를 멈추므로 카나리를 그대로 재현 불가
Random 실행 시 무작위 값 공격자가 값 예측 불가
Random XOR 랜덤값 XOR 제어 데이터(RET 등) RET만 바꿔도 불일치

Stack Shield

2-6. 방어 기법 ② ASLR · DEP/NX

ASLR (Address Space Layout Randomization)

실행 1회차         실행 2회차
┌───────────┐     ┌───────────┐
│스택 0xbf8..│     │스택 0xbfd..│ ← 매번 다름
│libc 0xb75..│     │libc 0xb7e..│ ← 매번 다름
│힙  0x09a.. │     │힙  0x08c.. │ ← 매번 다름
│코드 0x080.. │     │코드 0x080.. │ ← PIE 아니면 고정
└───────────┘     └───────────┘
$ cat /proc/sys/kernel/randomize_va_space
2
# 0 = 비활성 (취약)
# 1 = 스택, 라이브러리(mmap), vdso 랜덤화
# 2 = 1 + 힙(brk) 랜덤화  (기본값, 권장)
$ sysctl -w kernel.randomize_va_space=2

DEP / NX bit

2-7. 방어 우회 개념: RTL · ROP

"스택에서 실행이 안 되면, 이미 실행 가능한 코드를 재사용하자"는 발상이다.

RTL (Return-to-Libc)

ROP (Return-Oriented Programming)

flowchart TD
    A["고전 BOF
스택에 쉘코드"] -->|"방어: NX/DEP"| B["RTL
libc 함수 재사용"] B -->|"방어: ASLR"| C["ROP + 주소 유출
가젯 연결"] C -->|"방어: CFI·섀도 스택"| D["계속되는 공방"] A -->|"방어: Canary"| E["카나리 유출 시도"]

방어 기법 총정리

기법 막는 것 원리 우회 개념
Canary RET 덮어쓰기 RET 앞 검사값 카나리 값 유출
Stack Shield RET 변조 RET 사본 대조 함수 포인터 등 다른 대상
ASLR 주소 예측 주소 무작위화 주소 유출, 반복 시도
DEP/NX 스택·힙 코드 실행 실행 금지 비트 RTL, ROP
PIE 코드 주소 예측 코드도 재배치 주소 유출
RELRO GOT 덮어쓰기 GOT 읽기 전용화 —
안전 함수 근본 원인 길이 검사 —

2-8. 포맷 스트링 공격

printf 계열 함수는 첫 번째 인자(포맷 문자열)를 해석해 %d, %s 를 만날 때마다 스택에서 다음 인자를 꺼낸다. 그런데 사용자 입력을 포맷 문자열 자리에 그대로 넣으면, 사용자가 %x 를 넣는 순간 printf 는 존재하지 않는 인자를 찾아 스택을 읽어 버린다.

/* 취약 */
void log_msg(char *user_input) {
    printf(user_input);          /* 사용자가 포맷을 조종 */
}

/* 안전 */
void log_msg_safe(char *user_input) {
    printf("%s", user_input);    /* 입력은 단지 '데이터' */
}

스택 읽기 그림 (개념)

printf(buf), buf = "%x %x %x"

┌──────────────────┐
│ buf 주소 (포맷)    │ ← 실제 유일한 인자
├──────────────────┤
│ 0xbffff6a0       │ ← 1번째 %x 가 읽음
├──────────────────┤
│ 0x00000010       │ ← 2번째 %x
├──────────────────┤
│ 0x41414141       │ ← 3번째 %x
└──────────────────┘   (지역변수 내용 노출)
출력: bffff6a0 10 41414141
→ 메모리 내용 유출

주요 포맷 지정자와 악용

지정자 정상 의미 공격 시 효과
%x 16진수 출력 스택 값 읽기(정보 유출)
%s 주소가 가리키는 문자열 임의 주소 읽기, 잘못된 주소면 크래시(DoS)
%n 지금까지 출력한 바이트 수를 해당 주소에 기록 메모리 쓰기 → RET·GOT 변조
%hn %n 의 2바이트 버전 정밀한 쓰기

2-9. 레이스 컨디션 (Race Condition)

두 프로세스가 같은 자원을 두고 "경주"할 때, 실행 순서·타이밍에 따라 결과가 달라지는 취약점이다. 보안에서는 주로 TOCTOU(Time Of Check to Time Of Use) — "검사한 시점"과 "사용한 시점" 사이의 틈을 노린다.

전형적 시나리오: SUID root 프로그램의 임시 파일

  1. root 권한으로 동작하는 프로그램이 /tmp/report.tmp 라는 예측 가능한 이름의 임시 파일을 만든다.
  2. 공격자는 그 순간을 노려 같은 이름으로 심볼릭 링크 /tmp/report.tmp → /etc/shadow 를 만든다.
  3. 프로그램은 링크인지 모르고 root 권한으로 파일에 쓴다 → 실제로는 /etc/shadow 가 덮어써짐.

타임라인

시간 ↓
[SUID 프로그램(root)]   [공격자(일반 사용자)]

① /tmp/x 검사 OK
        │
        │   ② rm /tmp/x
        │   ③ ln -s /etc/passwd /tmp/x
        │      ↑ 이 틈(window)!
        ▼
④ /tmp/x 열고 쓰기
 → 링크를 따라가
   /etc/passwd 를
   root 권한으로 수정
sequenceDiagram
    participant P as SUID 프로그램(root)
    participant FS as /tmp
    participant A as 공격자
    P->>FS: 1. 파일 존재·권한 검사 (Check)
    A->>FS: 2. 같은 이름을 심볼릭 링크로 교체
    P->>FS: 3. 파일 열고 쓰기 (Use)
    FS-->>P: 실제로는 링크 대상 파일에 기록

취약 vs 안전 코드

/* 취약: 예측 가능한 이름 + 검사와 사용 분리 */
if (access("/tmp/app.tmp", F_OK) != 0) {          /* Check */
    FILE *fp = fopen("/tmp/app.tmp", "w");        /* Use  */
    /* ... */
}

/* 안전: mkstemp
   - 무작위 이름
   - 원자적 생성(O_CREAT|O_EXCL)
   - 권한 0600 */
#include <stdlib.h>
#include <unistd.h>
char tmpl[] = "/tmp/appXXXXXX";      /* XXXXXX 가 랜덤으로 치환 */
int fd = mkstemp(tmpl);
if (fd != -1) {
    /* fd 로만 작업 */
    unlink(tmpl);                    /* 이름은 바로 제거 */
    close(fd);
}

대응 방법

2-10. 정수 오버플로 (Integer Overflow)

정수형 변수는 담을 수 있는 범위가 정해져 있다. 범위를 넘으면 값이 뒤집힌다(wrap-around). 자동차 주행거리계가 999999 다음에 000000이 되는 것과 같다.

자료형 범위 넘칠 때
unsigned char 0 ~ 255 255 + 1 → 0
signed char -128 ~ 127 127 + 1 → -128 (구현 의존)
int (32bit) 약 -21억 ~ +21억 최댓값 + 1 → 음수
unsigned int 0 ~ 약 42억 0 - 1 → 4,294,967,295

보안 문제가 되는 패턴

/* 취약: 부호 있는 길이 검사 후 부호 없는 크기로 사용 */
void copy_data(char *src, int len) {
    char buf[100];
    if (len < 100) {            /* len = -1 이면 통과! */
        memcpy(buf, src, len);  /* size_t(부호 없음)로 해석
                                   → 매우 큰 수 → BOF */
    }
}

/* 안전: 부호 없는 타입 + 범위 검사 */
void copy_data_safe(const char *src, size_t len) {
    char buf[100];
    if (len > 0 && len < sizeof(buf)) {
        memcpy(buf, src, len);
    }
}

⚠️ 시험 함정 (Day 2)

기출 포인트 (Day 2)

확인 문제 (Day 2)

Q1. 스택 버퍼 오버플로 공격에서 공격자가 프로그램의 실행 흐름을 바꾸기 위해 주로 덮어쓰는 값은?
① 힙 청크의 크기 정보 ② 함수의 리턴 주소(RET) ③ BSS 영역의 전역 변수 ④ 코드 영역의 명령어

Q2. 함수 시작 시 리턴 주소를 별도의 안전한 메모리 영역에 복사해 두었다가 함수 종료 시 비교하는 방어 기법은?
① Stack Guard ② Stack Shield ③ ASLR ④ NX bit

Q3. NX(DEP)가 적용된 환경에서 스택의 코드 실행 제한을 우회하기 위해 사용되는 기법으로 가장 적절한 것은?
① NOP sled ② Return-to-Libc ③ 힙 스프레이 ④ Terminator Canary

Q4. 다음 코드의 취약점과 수정 방법이 올바르게 짝지어진 것은?
void f(char *s) { printf(s); }
① 레이스 컨디션 – mkstemp 사용 ② 포맷 스트링 – printf("%s", s) ③ 정수 오버플로 – size_t 사용 ④ 힙 오버플로 – free 후 NULL 대입

Q5. 레이스 컨디션 공격에 대한 대응으로 옳지 않은 것은?
① 임시 파일 생성 시 mkstemp()를 사용한다 ② 임시 파일 이름을 프로그램마다 고정된 이름으로 정해 관리한다 ③ 파일 생성 시 O_CREAT와 O_EXCL 플래그를 함께 사용한다 ④ 심볼릭 링크 여부를 확인하고 따라가지 않도록 한다

Q6. 리눅스에서 /proc/sys/kernel/randomize_va_space 값이 2 일 때의 의미로 옳은 것은?
① ASLR 비활성 ② 스택만 랜덤화 ③ 스택·라이브러리·힙까지 랜덤화 ④ NX bit 활성화


Day 3 · 악성코드 · 사회공학 · 엔드포인트 보안

3-1. 악성코드 분류의 기준

악성코드(Malware)를 구분하는 두 가지 핵심 질문만 기억하면 대부분 풀린다.

  1. 스스로 복제(증식)하는가?
  2. 숙주(다른 파일)가 필요한가, 독립 실행되는가?
flowchart TD
    M["악성코드"] --> R{"자기 복제?"}
    R -->|"예"| H{"숙주 파일 필요?"}
    H -->|"예"| V["바이러스"]
    H -->|"아니오, 독립 실행"| W["웜"]
    R -->|"아니오"| N["비복제형"]
    N --> T["트로이목마
정상 위장"] N --> B["백도어
인증 우회 통로"] N --> RK["루트킷
은닉·권한 유지"] N --> RS["랜섬웨어
암호화·금전 요구"] N --> SP["스파이웨어·키로거
정보 수집"] N --> LB["논리 폭탄
조건부 실행"] N --> BOT["봇
원격 조종"]

랜섬웨어·봇은 웜 기능(자기 전파)을 결합한 변종도 많다(예: 2017 WannaCry는 SMB 취약점으로 전파하는 랜섬웨어 + 웜). 시험에서는 "기본 정의"로 판단한다.

3-2. 바이러스

정의: 다른 프로그램(숙주)에 자신의 코드를 삽입(기생) 해, 숙주가 실행될 때 함께 실행되며 다른 파일로 자기 복제하는 악성코드. 사람 바이러스가 세포 없이 증식 못 하듯, 숙주가 필요하다.

감염 위치에 따른 분류

유형 감염 대상 예
부트 바이러스 부트 섹터, MBR 브레인(Brain), 미켈란젤로
파일 바이러스 실행 파일(COM, EXE) 예루살렘, CIH(체르노빌)
부트/파일 바이러스 둘 다 침입자, 나타스
매크로 바이러스 문서 파일의 매크로(Word, Excel) 멜리사(Melissa), 라룩스

파일 감염 방식: 겹쳐쓰기형(원본 파괴), 기생형(앞·뒤에 붙음, 원본 유지), 산란형(같은 이름의 다른 확장자 파일 생성, 예: COM이 EXE보다 먼저 실행되는 점 악용), 연결형(디렉터리 정보 조작).

바이러스 세대 구분 (진화 = 백신을 피하는 방향)

세대 이름 특징 백신 회피 원리
1세대 원시형 단순 구조, 고정 코드 없음 (시그니처로 쉽게 탐지)
2세대 암호형 몸체를 암호화, 실행 시 복호화 루틴으로 풀림 몸체 시그니처 숨김 (단, 복호화 루틴은 고정)
3세대 은폐형(스텔스) 감염 사실을 숨김: 파일 크기·날짜를 원래대로 보여 줌 시스템 호출 가로채 감염 전 정보 반환
4세대 갑옷형(Armor) 다양한 암호화·난독화로 분석 자체를 어렵게 함. 다형성(Polymorphic) 바이러스 포함: 감염 때마다 복호화 루틴까지 변형 고정 시그니처 자체가 없음
5세대 매크로 문서의 매크로 기능 이용, 플랫폼 독립적 실행 파일이 아니라 문서로 전파

3-3. 웜 · 트로이목마 · 백도어

웜(Worm)

트로이목마(Trojan Horse)

백도어(Backdoor, Trapdoor)

비교 바이러스 웜 트로이목마
자기 복제 O O X
숙주 필요 O X (독립) X (독립 실행 파일)
전파 수단 감염 파일 실행·공유 네트워크 자동 전파 사용자가 속아서 설치
주 피해 파일 손상 네트워크 부하 정보 유출, 원격 제어

3-4. 루트킷 (Rootkit)

이름 그대로 "root 권한을 유지하기 위한 도구 모음(kit)". 침입에 성공한 공격자가 흔적을 숨기고(은닉), 다시 들어올 수 있게(백도어) 하며, 관리자 권한을 유지하는 것이 목적.

주요 기능: 프로세스·파일·네트워크 연결 숨기기, 로그 삭제·변조, 백도어, 스니퍼, 키로거.

┌───────────────────────────────┐
│ 사용자 공간                     │
│  ls, ps, netstat  ← ①사용자 모드 │
│                     루트킷이     │
│                     바이너리 교체 │
├───────────────────────────────┤
│ 시스템 콜 테이블  ← ②커널 모드    │
│ 커널 모듈(LKM)      루트킷이     │
│                     후킹·조작    │
└───────────────────────────────┘
구분 사용자 모드(User-mode) 루트킷 커널 모드(Kernel-mode) 루트킷
동작 위치 사용자 공간 (Ring 3) 커널 공간 (Ring 0)
방법 ls, ps, netstat, login 같은 시스템 바이너리를 변조본으로 교체, 라이브러리 후킹 LKM(적재 가능 커널 모듈) 로 커널에 삽입, 시스템 콜 테이블 후킹, DKOM(커널 객체 직접 조작)
탐지 상대적으로 쉬움 — 무결성 점검(Tripwire, 해시 비교) 으로 바이너리 변조 발견 매우 어려움 — 커널이 거짓말을 하므로 그 위의 모든 도구가 속음
예 lrk(Linux RootKit) 계열 knark, adore 계열

3-5. 랜섬웨어 · 봇넷 · 파일리스 · 기타

랜섬웨어(Ransomware) = Ransom(몸값) + Software

봇(Bot) / 봇넷(Botnet)

        [공격자/봇마스터]
               │
          [C&C 서버]
       ┌──────┼──────┐
     [봇]   [봇]    [봇]   ← 감염 PC(좀비)
       └──────┼──────┘
               ▼
          [공격 대상]  ← DDoS

파일리스(Fileless) 악성코드

기타

유형 설명
스파이웨어 사용자 몰래 정보 수집(브라우징, 개인정보)
키로거 키보드 입력 기록 → 계정 탈취
애드웨어 광고 강제 노출
논리 폭탄(Logic Bomb) 특정 조건(날짜, 특정 사용자 삭제 등) 충족 시 실행. 퇴사자가 심는 사례
드로퍼(Dropper) 내부에 악성코드를 품고 있다가 설치
다운로더 외부에서 악성코드를 내려받아 설치
익스플로잇 킷 웹 접속자의 브라우저·플러그인 취약점을 자동 공격
혹스(Hoax) 거짓 바이러스 경고로 불안 조장 (실제 코드 없음)
크립토재킹 피해자 자원으로 암호화폐 채굴

3-6. 악성코드 분석: 정적 · 동적 · 샌드박스

구분 정적 분석 (Static) 동적 분석 (Dynamic)
실행 여부 실행하지 않음 실제 실행(격리 환경)
기초 수준 해시 조회(VirusTotal), 문자열 추출(strings), PE 헤더·임포트 함수 확인, 패킹 여부(PEiD 등) 프로세스·파일·레지스트리·네트워크 변화 관찰(Process Monitor, Process Explorer, Wireshark, Regshot)
고급 수준 디스어셈블·디컴파일(IDA, Ghidra) 디버깅(x64dbg, OllyDbg, WinDbg)으로 단계별 실행
장점 안전, 전체 코드 경로 파악 실제 행위 빠르게 파악, 난독화 영향 적음
단점 패킹·난독화에 약함, 시간 소요 감염 위험, 안티VM·안티디버깅·조건부 실행 시 행위 안 보임

분석 절차 (보통 순서)

flowchart LR
    A["1 기초 정적
해시·문자열·PE"] --> B["2 기초 동적
샌드박스 실행·행위 관찰"] B --> C["3 고급 정적
디스어셈블"] C --> D["4 고급 동적
디버깅"] D --> E["IoC 추출
해시·IP·도메인"]

3-7. 탐지 기법과 엔드포인트 보안 솔루션

백신의 탐지 방식

방식 원리 장점 단점
시그니처(패턴) 기반 알려진 악성코드의 고유 바이트 패턴·해시와 비교 오탐 낮음, 빠름 신종·변종(제로데이) 탐지 불가
휴리스틱 의심스러운 코드 특징·명령 조합에 점수 변종 일부 탐지 오탐 증가
행위 기반 실행 중 행위(대량 파일 암호화, 자기 복제) 감시 신종·파일리스 대응 실행 후 탐지, 오탐
평판 기반 파일·URL의 유포 규모·나이 빠른 판단 신규 정상 파일 오탐

EPP · EDR · XDR

         사전 예방            탐지·대응             통합
 ┌───────────────┐   ┌──────────────┐   ┌──────────────────┐
 │ EPP            │   │ EDR           │   │ XDR               │
 │ 백신·방화벽·    │ → │ 엔드포인트 행위 │ → │ 엔드포인트+네트워크 │
 │ 기기 제어      │   │ 기록·분석·격리 │   │ +이메일+클라우드   │
 │ "들어오지 마"   │   │ "들어왔으면 찾아 │   │ 상관 분석·자동 대응 │
 │               │   │  막는다"       │   │                   │
 └───────────────┘   └──────────────┘   └──────────────────┘
구분 EPP EDR XDR
정식 명칭 Endpoint Protection Platform Endpoint Detection & Response eXtended Detection & Response
목적 예방(사전 차단) 탐지·조사·대응(사후) 여러 계층 통합 탐지·대응
핵심 기능 시그니처 백신, 개인 방화벽, 매체 제어, 앱 제어 단말 행위 지속 기록(텔레메트리), 위협 헌팅, 공격 흐름 시각화, 단말 격리, 프로세스 종료 엔드포인트·네트워크·이메일·클라우드·ID 데이터 상관 분석
강점 알려진 위협 알려지지 않은 위협, 파일리스, APT 가시성 범위 최대

3-8. 사회공학 공격

사회공학(Social Engineering): 기술이 아니라 사람의 심리(신뢰, 호기심, 두려움, 긴급성, 권위) 를 이용해 정보를 얻거나 행동을 유도하는 공격. 보안에서 가장 약한 고리는 사람이라는 점을 노린다.

유형 비교

공격 매체·대상 핵심 특징
피싱(Phishing) 이메일·웹, 불특정 다수 가짜 메일 + 가짜 사이트로 계정·금융정보 입력 유도
스피어 피싱 이메일, 특정 개인·조직 대상 맞춤 내용(이름, 직책, 업무) → APT 최초 침투의 단골
웨일링(Whaling) 경영진·고위층(CEO, CFO) 고래(큰 물고기) 사냥. 송금 승인 권한 노림
BEC(비즈니스 이메일 침해) 기업 거래 이메일 거래처·임원 사칭해 대금 계좌 변경 요청
파밍(Pharming) DNS·hosts 파일 변조 사용자가 정상 주소를 직접 입력해도 가짜 사이트로 연결
스미싱(Smishing) SMS(문자) 택배·청첩장·결제 문자 + 악성 앱 설치 링크
큐싱(Qshing) QR 코드 QR 위에 가짜 QR을 붙이거나 메일에 QR 첨부
비싱(Vishing) 음성 전화(Voice) 보이스피싱. 수사기관·금융기관 사칭
워터링 홀(Watering Hole) 타깃이 자주 방문하는 웹사이트 그 사이트를 먼저 감염시켜 놓고 기다림(물웅덩이에서 사냥감을 기다리는 맹수)
프리텍스팅 전화·대면 그럴듯한 상황(핑계)을 만들어 정보 요구
베이팅(Baiting) USB 등 미끼 주차장에 악성 USB 떨어뜨리기
테일게이팅·피기백킹 물리 출입 직원 뒤를 따라 출입문 통과
숄더 서핑 대면 어깨 너머로 비밀번호 엿보기
덤스터 다이빙 쓰레기통 버린 문서에서 정보 수집

파밍 동작 원리 (피싱과 구분 필수)

[피싱]  사용자 ──클릭──▶ 가짜 링크(bank-l0gin.com) ──▶ 가짜 사이트
         └ 주소가 이상한 걸 눈치채면 피할 수 있음

[파밍]  사용자 ──입력: www.bank.com (정상 주소!)
         │
         ▼ 변조된 hosts 파일 / DNS 캐시 / DNS 서버
         "www.bank.com = 공격자 IP"
         ▼
        가짜 사이트  ← 주소창은 정상처럼 보임

3-9. APT (지능형 지속 위협)

APT(Advanced Persistent Threat)

APT 공격 단계 (일반적 생명주기)

flowchart LR
    A["1 정찰
정보 수집"] --> B["2 최초 침투
스피어피싱·워터링홀
·제로데이"] B --> C["3 거점 확보
백도어·C&C 연결"] C --> D["4 권한 상승·
내부 확산
(Lateral Movement)"] D --> E["5 정보 수집"] E --> F["6 유출·파괴"] F -.->|"지속 잠복"| C
단계 하는 일 대응
정찰(Reconnaissance) SNS·홈페이지에서 조직도, 이메일, 사용 SW 조사 공개 정보 최소화, 보안 인식 교육
최초 침투(Initial Compromise) 스피어피싱 첨부파일, 워터링 홀, 제로데이 메일 보안, 샌드박스, 패치
거점 확보(Establish Foothold) 백도어·RAT 설치, C&C 통신 EDR, 아웃바운드 트래픽 감시
권한 상승·내부 이동 자격증명 탈취(Pass-the-Hash), 다른 서버로 확산 계정 최소 권한, 망 분리, 다중 인증
정보 수집·유출(Exfiltration) 압축·암호화 후 외부 전송 DLP, 이상 트래픽 탐지

사이버 킬 체인(Cyber Kill Chain, 록히드 마틴 7단계) — 단계 이름 순서가 출제된다.

  1. 정찰(Reconnaissance)
  2. 무기화(Weaponization) — 악성 문서·익스플로잇 제작
  3. 전달(Delivery) — 메일, 웹, USB
  4. 익스플로잇(Exploitation) — 취약점 공격으로 코드 실행
  5. 설치(Installation) — 악성코드·백도어 설치
  6. 명령 및 제어(C2)
  7. 목적 달성(Actions on Objectives)

핵심 사상: 어느 한 단계라도 끊으면 공격이 실패한다 → 단계별 방어(심층 방어).

참고: MITRE ATT&CK 는 실제 관측된 공격자의 전술(Tactics)·기법(Techniques) 을 매트릭스로 정리한 지식 베이스. 킬 체인보다 세분화되어 있다.

사회공학·APT 대응 (관리적 + 기술적)

⚠️ 시험 함정 (Day 3)

기출 포인트 (Day 3)

확인 문제 (Day 3)

Q1. 다음 설명에 해당하는 악성코드는?
"정상적인 유틸리티 프로그램으로 위장해 사용자가 직접 설치하도록 유도하며, 설치 후 원격 제어 기능을 제공하지만 스스로 다른 파일이나 시스템으로 복제되지는 않는다."
① 웜 ② 파일 바이러스 ③ 트로이목마 ④ 매크로 바이러스

Q2. 감염될 때마다 암호화 방식과 복호화 루틴까지 변경해 고정된 시그니처로는 탐지하기 어려운 바이러스는?
① 원시형 바이러스 ② 암호형 바이러스 ③ 다형성 바이러스 ④ 부트 바이러스

Q3. 사용자가 웹 브라우저에 정상적인 은행 주소를 직접 입력했음에도 공격자가 만든 가짜 사이트로 접속되었다. 이 공격의 원인으로 가장 가능성이 높은 것은?
① 스미싱 문자의 링크 클릭 ② hosts 파일 또는 DNS 정보 변조 ③ 워터링 홀 공격 ④ 숄더 서핑

Q4. 커널 모드 루트킷에 대한 설명으로 옳지 않은 것은?
① 시스템 콜 테이블을 후킹해 파일·프로세스를 숨길 수 있다 ② 적재 가능한 커널 모듈(LKM) 형태로 삽입될 수 있다 ③ ls, ps 등 사용자 명령어 바이너리의 해시만 비교하면 항상 탐지할 수 있다 ④ 사용자 모드 루트킷보다 일반적으로 탐지가 어렵다

Q5. 록히드 마틴의 사이버 킬 체인 단계를 순서대로 바르게 나열한 것은?
① 정찰 → 전달 → 무기화 → 익스플로잇 → 설치 → C2 → 목적 달성
② 정찰 → 무기화 → 전달 → 익스플로잇 → 설치 → C2 → 목적 달성
③ 무기화 → 정찰 → 전달 → 설치 → 익스플로잇 → C2 → 목적 달성
④ 정찰 → 무기화 → 익스플로잇 → 전달 → C2 → 설치 → 목적 달성

Q6. EDR(Endpoint Detection and Response)의 기능으로 가장 거리가 먼 것은?
① 엔드포인트 행위 데이터의 지속적 수집·기록 ② 의심 단말의 네트워크 격리 ③ 공격 흐름 시각화 및 위협 헌팅 지원 ④ 네트워크 경계에서 패킷을 검사해 침입을 차단하는 인라인 방화벽 기능


Day 4 · 리눅스 보안 점검 · Nmap (실기와 직결)

기본 개념(권한 비트, SUID/SGID/Sticky, /etc/passwd·/etc/shadow 필드, 로그 파일 종류, syslog 설정)은 Week02_운영체제 기초 에 있다. 여기서는 "점검 명령 → 결과 → 양호/취약 판단 → 조치" 흐름으로 익힌다.

4-1. 취약점 점검의 틀

주요정보통신기반시설 기술적 취약점 분석·평가 가이드(KISA 발간, 실무에서 "U-01" 같은 항목 번호로 부름)는 유닉스/리눅스 서버 점검 항목을 크게 5개 영역으로 나눈다. 판정은 항목마다 양호 / 취약 으로 낸다.

영역 대표 점검 항목
1. 계정 관리 root 원격 접속 제한(U-01), 패스워드 복잡성, 계정 잠금 임계값, 패스워드 파일 보호(shadow), UID 0 계정, su 제한, 불필요 계정
2. 파일 및 디렉터리 관리 PATH 설정, 소유자 없는 파일, 주요 파일 권한(passwd·shadow·hosts·inetd.conf·syslog.conf·services), SUID/SGID, World Writable, .rhosts·hosts.equiv, 접속 IP 제한, umask, 홈 디렉터리
3. 서비스 관리 finger, Anonymous FTP, r 계열, cron 권한, DoS 취약 서비스(echo·chargen 등), NFS, automountd, RPC, NIS, tftp·talk, Sendmail, DNS, 웹 서버(Apache) 설정, SSH 사용, ftp 계정 쉘, SNMP 커뮤니티
4. 패치 관리 최신 보안 패치 적용
5. 로그 관리 로그 정기 검토, 정책에 따른 로깅 설정

항목 번호는 가이드 개정판마다 바뀔 수 있으니 번호보다 "항목 이름 + 판단 기준" 으로 외운다. 단 U-01 = root 원격 접속 제한 은 너무 유명해서 그대로 기억해 두자.

4-2. 계정 관리

① root 원격 접속 제한

왜? root로 바로 원격 로그인되면 (1) 무차별 대입 공격의 표적이 root 하나로 집중되고 (2) 누가 root를 썼는지 책임 추적이 안 된다. 정답은 "일반 계정으로 로그인 → su/sudo".

# SSH
$ grep -i "^PermitRootLogin" /etc/ssh/sshd_config
PermitRootLogin yes           ← 취약
PermitRootLogin no            ← 양호
# 조치: no 로 수정 후 재시작
$ sudo systemctl restart sshd

최신 OpenSSH의 기본값은 prohibit-password(키 인증만 허용)이지만, 점검 가이드 기준은 no 가 양호.

# Telnet (사용 시)
$ cat /etc/securetty | grep pts
pts/0                         ← 취약 (pts = 원격 가상 터미널)
pts/1
# 조치: pts/* 줄을 모두 삭제·주석 처리
$ grep pam_securetty /etc/pam.d/login
auth  required  pam_securetty.so   ← 이 줄이 있어야 securetty 가 적용됨

② 패스워드 복잡성·사용 기간

$ grep -E "^PASS_(MAX|MIN)_(DAYS|LEN)" /etc/login.defs
PASS_MAX_DAYS   90     ← 최대 사용 기간 (90일 이하 권장)
PASS_MIN_DAYS   1      ← 최소 사용 기간 (바로 원래 암호로 되돌리기 방지)
PASS_MIN_LEN    8

$ cat /etc/security/pwquality.conf | grep -v "^#"
minlen = 8
dcredit = -1     ← 숫자 최소 1자 (음수 = "최소 개수")
ucredit = -1     ← 대문자
lcredit = -1     ← 소문자
ocredit = -1     ← 특수문자

③ 계정 잠금 임계값

# RHEL 8/9 계열: pam_faillock
$ grep faillock /etc/pam.d/system-auth
auth  required  pam_faillock.so preauth silent deny=5 unlock_time=600
auth  [default=die] pam_faillock.so authfail deny=5 unlock_time=600
# 또는 /etc/security/faillock.conf 에 deny = 5

# 구버전: pam_tally2
auth  required  pam_tally2.so deny=5 unlock_time=120 no_magic_root
account required pam_tally2.so no_magic_root reset

④ 패스워드 파일 보호 (shadow 사용)

$ head -2 /etc/passwd
root:x:0:0:root:/root:/bin/bash     ← 두 번째 필드 'x' = shadow 사용 → 양호
kim:$6$Ab..:1000:1000::/home/kim:/bin/bash ← 해시가 passwd 에 있음 → 취약
# 조치: pwconv (passwd → shadow 로 분리)

⑤ UID 0 계정 (root 이외)

$ awk -F: '$3==0 {print $1}' /etc/passwd
root
toor                  ← 취약: root 외 UID 0 은 백도어 의심
# 조치: usermod -u 로 UID 변경 또는 계정 삭제

⑥ su 명령 사용 제한

$ grep pam_wheel /etc/pam.d/su
auth  required  pam_wheel.so use_uid   ← 주석(#) 없으면 양호
$ ls -l /usr/bin/su
-rwsr-x---. 1 root wheel ... /usr/bin/su  ← 그룹 wheel, 4750 → 양호
-rwsr-xr-x. 1 root root  ... /usr/bin/su  ← 누구나 su 실행 가능 → 취약

⑦ 불필요한 계정·로그인 쉘

$ grep -E "^(lp|uucp|nuucp|games|news):" /etc/passwd
games:x:12:100:games:/usr/games:/bin/bash   ← 취약: 로그인 불필요 계정에 쉘
# 조치
$ usermod -s /sbin/nologin games      # 또는 /bin/false
$ userdel 불필요계정

4-3. 파일 및 디렉터리 관리

① PATH 환경변수

$ echo $PATH
.:/usr/local/bin:/usr/bin:/bin       ← 취약: 맨 앞에 '.'
/usr/local/bin:/usr/bin:/bin:        ← 취약: 끝의 ':' 도 현재 디렉터리
/usr/local/bin:/usr/bin:/bin         ← 양호

왜 위험한가? 공격자가 /tmp 에 ls 라는 악성 스크립트를 만들어 두면, root가 /tmp 에서 ls 를 입력할 때 /bin/ls 대신 ./ls 가 root 권한으로 실행된다. . 이나 :: 가 PATH 앞·중간에 있으면 취약.

② 주요 파일 소유자·권한 기준 (가이드 판정 기준)

파일 소유자 권한 (이하)
/etc/passwd root 644
/etc/shadow root 400 (000도 가능)
/etc/hosts root 600
/etc/(x)inetd.conf root 600
/etc/(r)syslog.conf root(또는 bin, sys) 640
/etc/services root(또는 bin, sys) 644
hosts.lpd root 600
$ ls -l /etc/shadow
----------. 1 root root 1234 ... /etc/shadow   ← 000 양호
-rw-r--r--. 1 root root 1234 ... /etc/shadow   ← 644 취약 (누구나 해시 읽기)
# 조치
$ chown root /etc/shadow; chmod 400 /etc/shadow

③ SUID/SGID 파일 점검

SUID 파일은 실행하는 동안 소유자(대개 root) 권한을 가진다. Day 2의 버퍼 오버플로가 있는 SUID root 파일 = 권한 상승 통로.

$ find / -user root -type f \( -perm -4000 -o -perm -2000 \) -xdev -exec ls -l {} \; 2>/dev/null
-rwsr-xr-x. 1 root root  ... /usr/bin/passwd     ← 정상(비밀번호 변경에 필요)
-rwsr-xr-x. 1 root root  ... /usr/bin/sudo       ← 정상
-rwsr-xr-x. 1 root root  ... /usr/bin/newgrp
-rwsr-xr-x. 1 root root  ... /tmp/.x/bash        ← ★ 의심! /tmp 에 SUID 쉘
-rwxr-sr-x. 1 root lp    ... /usr/bin/lpq

④ World Writable 파일

$ find / -type f -perm -2 -xdev -exec ls -l {} \; 2>/dev/null
-rw-rw-rw-. 1 root root 220 ... /etc/cron.daily/backup.sh  ← ★ 취약
# 누구나 수정 가능한 root cron 스크립트 = 일반 사용자가 root 명령 실행 가능
# 조치
$ chmod o-w /etc/cron.daily/backup.sh

⑤ 소유자 없는 파일

$ find / \( -nouser -o -nogroup \) -xdev -ls 2>/dev/null
 262 4 -rw-r--r-- 1 1005 1005 ... /home/olduser/.bashrc

⑥ 사용자 홈·환경파일

⑦ umask

새로 만드는 파일의 기본 권한에서 뺄 값. 파일 기본 666, 디렉터리 777에서 umask를 뺀다(정확히는 비트 마스킹).

umask 새 파일 새 디렉터리 판정
000 666 (rw-rw-rw-) 777 취약
002 664 775 취약(가이드 기준)
022 644 (rw-r--r--) 755 양호
027 640 750 양호
077 600 700 양호(가장 엄격)
$ umask
0022                    ← 양호
$ grep umask /etc/profile /etc/bashrc
/etc/profile:    umask 022

4-4. 서비스 관리

① r 계열 서비스와 신뢰 관계(trust)

rlogin, rsh, rexec(TCP 513, 514, 512)는 신뢰 관계가 설정된 호스트·사용자라면 패스워드 없이 로그인시킨다. 편리하지만 IP/호스트명만 믿으므로 IP 스푸핑, 신뢰 파일 변조에 취약하고 평문 통신이다.

[호스트 A] ──"나 B의 kim이야"──▶ [호스트 B]
                               /etc/hosts.equiv 또는
                               ~kim/.rhosts 에 A가 있으면
                               패스워드 없이 통과!
$ cat /etc/hosts.equiv
+                ← ★ 가장 위험: 모든 호스트 신뢰
$ cat /home/kim/.rhosts
+ +              ← ★ 모든 호스트의 모든 사용자 신뢰
trusted-host kim ← 특정 호스트·사용자만 (그래도 권장 안 함)
$ ls -l /etc/hosts.equiv
-rw-------. 1 root root ...   ← 소유자 root, 600 이하여야 함

② 불필요 서비스 비활성화

서비스 위험
finger (79) 사용자 계정·로그인 정보 노출
echo(7), discard(9), daytime(13), chargen(19) DoS 공격(증폭·루프) 에 악용
tftp (69/UDP) 인증 없음 — 설정 파일 탈취
talk, ntalk 불필요
telnet (23), ftp (21) 평문 전송 → SSH/SFTP로 대체
Anonymous FTP 익명 접근, 파일 업로드 악용
NFS, NIS, RPC 계열 공유 설정 오류 시 정보 노출
SNMP 기본 커뮤니티 public/private 사용 시 정보 노출·설정 변경
# systemd
$ systemctl list-unit-files --state=enabled | grep -E "telnet|rsh|rlogin|tftp|finger"
telnet.socket   enabled      ← 취약
$ systemctl disable --now telnet.socket

# xinetd 방식
$ cat /etc/xinetd.d/telnet
service telnet
{
    disable     = no         ← 취약 (yes 로 변경)
    ...
}
# 구 inetd 방식: /etc/inetd.conf 에서 해당 줄 주석(#) 처리 후 inetd 재시작

③ xinetd 와 TCP Wrapper

flowchart TD
    C["클라이언트 접속"] --> A{"/etc/hosts.allow
매칭?"} A -->|"예"| OK["허용 (검사 종료)"] A -->|"아니오"| D{"/etc/hosts.deny
매칭?"} D -->|"예"| NO["거부"] D -->|"아니오"| OK2["허용 (기본)"]
# 권장 구성: 기본 거부 + 필요한 것만 허용
$ cat /etc/hosts.deny
ALL: ALL

$ cat /etc/hosts.allow
sshd: 192.168.10.0/255.255.255.0
sshd: 10.1.1.5
in.telnetd: 192.168.10.100

④ cron / at 접근 제어

cron.allow 존재?  ── 예 ──▶ 목록에 있는 사용자만 사용 가능 (deny 무시)
     │
    아니오
     ▼
cron.deny 존재?   ── 예 ──▶ 목록에 있는 사용자만 사용 불가
     │
    아니오
     ▼
 배포판에 따라 root만 또는 모두 사용 가능
$ ls -l /etc/cron.allow /etc/cron.deny
-rw-r-----. 1 root root  6 ... /etc/cron.allow   ← 소유자 root, 640 이하 양호
$ cat /etc/cron.allow
root
admin

⑤ SSH 추가 하드닝 (실무 권장)

# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no      # 키 인증만
PermitEmptyPasswords no
MaxAuthTries 3
Protocol 2                      # (구버전) SSHv1 금지
AllowUsers admin kim
ClientAliveInterval 300         # 유휴 세션 정리
Banner /etc/issue.net           # 경고 배너

4-5. 패치 · 로그 관리

패치 관리

로그 관리

$ lastb | head -3                  # 로그인 실패 (btmp)
root  ssh:notty  203.0.113.7  Sun Dec 28 03:12 - 03:12  (00:00)
root  ssh:notty  203.0.113.7  Sun Dec 28 03:12 - 03:12  (00:00)
admin ssh:notty  203.0.113.7  Sun Dec 28 03:11 - 03:11  (00:00)
# → 같은 IP에서 짧은 간격 반복 실패 = 무차별 대입 시도. 차단·계정잠금 확인

4-6. 무결성 점검: Tripwire · AIDE

루트킷·백도어는 시스템 파일을 바꾼다. "원래 상태의 지문(해시)"을 저장해 두고 주기적으로 비교하면 변조를 찾을 수 있다. 이것이 호스트 기반 무결성 점검(FIM, File Integrity Monitoring).

Tripwire 작업 흐름

flowchart TD
    A["1 정책 파일 작성
감시할 파일·속성 지정
twpol.txt"] --> B["2 키 생성·정책 서명
site key / local key"] B --> C["3 기준 DB 생성
tripwire --init
(깨끗한 상태에서!)"] C --> D["4 주기적 점검
tripwire --check
cron 으로 자동화"] D --> E{"변경 발견?"} E -->|"정상 변경
(패치 등)"| F["5 DB 갱신
tripwire --update"] E -->|"비인가 변경"| G["침해 대응"] F --> D
$ tripwire --check
Open Source Tripwire(R) Integrity Check Report
...
Rule Name                       Severity Level    Added    Removed  Modified
---------                       --------------    -----    -------  --------
* Critical system boot files    100               0        0        0
* System binaries               100               1        0        2
...
Modified:
"/usr/bin/ps"
"/usr/bin/netstat"
Added:
"/usr/bin/.sshd2"

→ ps, netstat 변경 + 숨김 파일 추가 = 사용자 모드 루트킷 강력 의심.

4-7. Nmap — 네트워크 스캐닝 도구

왜 시스템 보안에 스캐너가? 공격자는 공격 전 "어떤 서버가 살아 있고, 어떤 포트·서비스·버전이 열려 있는지" 먼저 조사(정찰)한다. 관리자도 같은 도구로 불필요하게 열린 포트를 먼저 찾아 닫는다.

주요 스캔 유형

옵션 이름 방식 열림 닫힘
-sT TCP Connect 3-way handshake 완전 연결 SYN/ACK → 연결 RST
-sS SYN(Half-open, Stealth) SYN만 보내고 SYN/ACK 받으면 RST로 끊음 → 로그 덜 남음, root 필요 SYN/ACK RST
-sF FIN FIN 플래그만 응답 없음 RST
-sX Xmas FIN+PSH+URG 응답 없음 RST
-sN NULL 플래그 없음 응답 없음 RST
-sA ACK ACK만 → 방화벽 필터링 여부 판단 — RST 오면 unfiltered
-sU UDP UDP 패킷 응답 또는 없음 ICMP Port Unreachable

FIN/Xmas/NULL 스캔은 RFC 793 동작에 의존 — 윈도우는 열린 포트에도 RST 를 보내 구분이 안 된다(리눅스·유닉스 대상에서 유효).

주요 옵션

옵션 기능
-sn 호스트 발견만(핑 스캔, 포트 스캔 X) — 구버전 -sP
-Pn 호스트 발견 생략(ICMP 막힌 대상)
-p 22,80 / -p- 포트 지정 / 전체 65535
-sV 서비스 버전 탐지
-O OS 탐지(TCP/IP 핑거프린팅)
-A 공격적 스캔: -O -sV -sC --traceroute
-sC, --script NSE(Nmap Scripting Engine) 스크립트 실행, 예: --script vuln
-T0~-T5 타이밍(0 Paranoid 느림·은밀 ~ 5 Insane 빠름)
-D 디코이(미끼 IP 섞기)
-oN / -oX / -oG / -oA 일반 / XML / grep용 / 모두 저장

포트 상태 6가지: open, closed, filtered(방화벽이 막아 판단 불가), unfiltered(ACK 스캔: 도달은 하나 열림 여부 모름), open|filtered, closed|filtered.

예시 (자신이 관리하는 서버 점검)

$ sudo nmap -sS -sV -O -p 1-1024 192.168.10.20
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for 192.168.10.20
Host is up (0.00041s latency).
Not shown: 1017 closed tcp ports (reset)
PORT    STATE    SERVICE  VERSION
21/tcp  open     ftp      vsftpd 3.0.3
22/tcp  open     ssh      OpenSSH 8.0 (protocol 2.0)
23/tcp  open     telnet   Linux telnetd
80/tcp  open     http     Apache httpd 2.4.37
111/tcp open     rpcbind  2-4 (RPC #100000)
512/tcp open     exec     netkit-rsh rexecd
513/tcp open     login
OS details: Linux 4.15 - 5.8
Nmap done: 1 IP address (1 host up) scanned in 9.12 seconds

결과 판단 (관리자 관점)

⚠️ 허가받지 않은 대상 스캔은 정보통신망법 위반 소지가 있다. 실습은 자신의 랩 환경에서만.

⚠️ 시험 함정 (Day 4)

기출 포인트 (Day 4)

확인 문제 (Day 4)

Q1. 다음 TCP Wrapper 설정에서 IP 192.168.10.50 이 sshd 에 접속을 시도할 때의 결과는?

/etc/hosts.allow : sshd: 192.168.10.0/255.255.255.0
/etc/hosts.deny  : ALL: ALL

① hosts.deny 의 ALL:ALL 이 우선이라 거부된다 ② hosts.allow 에 먼저 매칭되어 허용된다 ③ 두 파일 모두 매칭되므로 기본 정책에 따라 거부된다 ④ TCP Wrapper는 sshd 에 적용되지 않으므로 항상 허용된다

Q2. 리눅스 서버 점검 결과 umask 값이 027로 설정되어 있다. 새로 생성되는 일반 파일의 권한은?
① 750 ② 640 ③ 644 ④ 600

Q3. 다음 중 root 권한으로 SUID가 설정된 파일을 찾는 명령으로 옳은 것은?
① find / -user root -perm -4000 ② find / -user root -perm -1000 ③ find / -perm -2 -type f ④ find / -nouser

Q4. r 계열 서비스와 관련된 설명으로 옳지 않은 것은?
① rlogin, rsh, rexec 가 해당한다 ② /etc/hosts.equiv 와 $HOME/.rhosts 로 신뢰 관계를 설정한다 ③ 신뢰 파일에 '+' 를 설정하면 신뢰 대상을 엄격히 제한하는 의미가 된다 ④ 통신이 암호화되지 않아 SSH로 대체하는 것이 바람직하다

Q5. Nmap 스캔 중 FIN, PSH, URG 플래그를 설정해 전송하며, 대상 포트가 닫혀 있으면 RST 응답을, 열려 있으면 응답이 없는 것을 이용하는 스캔은?
① SYN 스캔 ② ACK 스캔 ③ Xmas 스캔 ④ Connect 스캔

Q6. Tripwire 운영에 대한 설명으로 가장 적절하지 않은 것은?
① 파일의 해시값과 속성 정보를 기준 데이터베이스에 저장한다 ② 기준 데이터베이스는 침해 사고가 의심될 때 처음 생성한다 ③ 정상적인 패치 후에는 데이터베이스를 갱신한다 ④ 데이터베이스와 정책 파일은 변조되지 않도록 보호해야 한다


Day 5 · 윈도우 보안 심화 · 계정 공격

SAM, SID(RID 500 = Administrator, 501 = Guest), 레지스트리 하이브 구조, 이벤트 로그 기본은 Week02_운영체제 기초 참고. 여기서는 점검·설정 위치·공격 원리에 집중한다.

5-1. 윈도우 보안 설정 도구 지도

도구 실행 용도
로컬 보안 정책 secpol.msc 계정 정책(암호·잠금), 로컬 정책(감사·사용자 권한·보안 옵션)
로컬 그룹 정책 편집기 gpedit.msc secpol 포함 더 넓은 정책
그룹 정책 관리(도메인) gpmc.msc AD 도메인 전체에 GPO 배포
컴퓨터 관리 compmgmt.msc 사용자·그룹, 공유 폴더, 이벤트 뷰어, 서비스
서비스 services.msc 서비스 시작 유형(자동/수동/사용 안 함)
이벤트 뷰어 eventvwr.msc 보안·시스템·응용 프로그램 로그
레지스트리 편집기 regedit 세부 설정 값
명령줄 net, reg, wevtutil, auditpol, PowerShell 점검 자동화

5-2. 계정 관리

① Administrator 계정 이름 변경

② Guest 계정 비활성화

C:\> net user guest
사용자 이름                guest
...
활성 계정                  아니요      ← 양호
                           예          ← 취약
C:\> net user guest /active:no

③ 관리자 그룹 최소화

C:\> net localgroup administrators
별칭     administrators
구성원
-------------------------------------------------------
Administrator
kim
backup_svc          ← 불필요한 관리자 권한? 확인 필요

④ 암호 정책 / 계정 잠금 정책 (secpol → 계정 정책)

정책 권장 기준(가이드 예시)
암호는 복잡성을 만족해야 함 사용
최소 암호 길이 8자 이상
최대 암호 사용 기간 90일 이하
최소 암호 사용 기간 1일 이상
최근 암호 기억 4개 이상
해독 가능한 암호화를 사용하여 암호 저장 사용 안 함 (사실상 평문 저장)
계정 잠금 임계값 5회 이하
계정 잠금 기간 / 잠금 수 초기화 시간 60분 이상
C:\> net accounts
강제 로그오프 시간:                    사용 안 함
최소 암호 사용 기간(일):               1
최대 암호 사용 기간(일):               90
최소 암호 길이:                        8
암호 기록 개수:                        4
잠금 임계값:                           5
잠금 기간(분):                         60
잠금 관찰 창(분):                      60

⑤ LM 해시 저장 안 함

⑥ 기타 보안 옵션

5-3. 공유 관리 · 널 세션

기본(관리) 공유: 윈도우는 관리 목적으로 숨김 공유(이름 끝 $)를 자동 생성한다.

C:\> net share
공유 이름    리소스                         설명
------------------------------------------------------------------
C$           C:\                            기본 공유
IPC$                                        원격 IPC
ADMIN$       C:\Windows                     원격 관리
Data         D:\Data                        (사용자 공유)
명령을 잘 실행했습니다.
공유 용도 위험
C$, D$ 드라이브 전체 관리자 자격증명이 털리면 전체 파일 접근, 악성코드 원격 복사
ADMIN$ C:\Windows 원격 실행 도구가 서비스 바이너리 복사에 사용(내부 확산)
IPC$ 프로세스 간 통신(명명된 파이프) 널 세션 의 통로

기본 공유 제거

C:\> reg query HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v AutoShareServer
    AutoShareServer    REG_DWORD    0x0          ← 양호
(값이 없거나 0x1)                                ← 취약 (기본 공유 자동 생성)

일반 공유 폴더 점검

널 세션(Null Session)

값 의미
0 제한 없음 (기본, 취약)
1 익명 사용자의 SAM 계정·공유 열거 차단
2 명시적 익명 권한이 없으면 접근 불가 (Windows 2000 에서만 의미, 이후 버전에서는 부작용 우려)

5-4. 서비스 관리

비활성 권장 서비스(불필요 시) 이유
Telnet 평문
FTP(IIS) / Anonymous FTP 평문, 익명 접근
SNMP (기본 커뮤니티) public 커뮤니티로 정보 노출
원격 레지스트리(Remote Registry) 원격에서 레지스트리 조회·수정
NetBIOS over TCP/IP 137~139 포트 정보 노출 → 필요 없으면 해제
불필요한 IIS 기능 디렉터리 리스팅, 샘플 파일, WebDAV
터미널 서비스(RDP) 사용 시 NLA, 접속 IP 제한, 기본 포트 변경, 세션 타임아웃
C:\> sc query RemoteRegistry
SERVICE_NAME: RemoteRegistry
        STATE              : 4  RUNNING      ← 불필요하면 취약
C:\> sc config RemoteRegistry start= disabled
C:\> sc stop RemoteRegistry

열린 포트·프로세스 확인

C:\> netstat -ano | findstr LISTENING
  TCP    0.0.0.0:135     0.0.0.0:0   LISTENING   912
  TCP    0.0.0.0:445     0.0.0.0:0   LISTENING   4
  TCP    0.0.0.0:3389    0.0.0.0:0   LISTENING   1180
  TCP    0.0.0.0:4444    0.0.0.0:0   LISTENING   6620   ← ★ 의심
C:\> tasklist /FI "PID eq 6620"
이미지 이름        PID 세션 이름   ...
svch0st.exe       6620 Console    ← 이름 위장(svchost 흉내)

5-5. 감사 정책과 이벤트 로그

감사 정책 (secpol → 로컬 정책 → 감사 정책)

항목 권장 무엇을 남기나
계정 로그온 이벤트 감사 성공·실패 도메인 컨트롤러가 자격증명 검증
로그온 이벤트 감사 성공·실패 해당 컴퓨터 로그온·로그오프
계정 관리 감사 성공·실패 계정 생성·삭제·변경·암호 재설정
정책 변경 감사 성공(·실패) 감사·권한 정책 변경
권한 사용 감사 실패 특권 사용
디렉터리 서비스 액세스 감사 실패 AD 객체 접근
개체 액세스 감사 실패 파일·레지스트리 접근(SACL 설정 필요)
시스템 이벤트 감사 성공·실패 시스템 시작·종료, 보안 로그 영향
프로세스 추적 감사 필요 시 프로세스 생성(4688)
C:\> auditpol /get /category:"로그온/로그오프"
시스템 감사 정책
범주/하위 범주                 설정
로그온/로그오프
  로그온                       성공 및 실패      ← 양호
  로그오프                     성공
  계정 잠금                    성공

주요 보안 이벤트 ID (Week02 기본에 추가)

ID 의미 분석 포인트
4624 로그온 성공 로그온 유형 확인
4625 로그온 실패 같은 IP 반복 → 무차별 대입
4634 / 4647 로그오프 / 사용자 시작 로그오프
4648 명시적 자격증명으로 로그온(runas 등) 내부 확산 흔적
4672 특수 권한 할당(관리자급 로그온) 관리자 로그온 추적
4688 새 프로세스 생성 명령줄 감사 시 공격 명령 확인
4720 사용자 계정 생성 공격자 백도어 계정
4722 / 4725 / 4726 계정 활성화 / 비활성화 / 삭제
4724 암호 재설정 시도
4732 보안 사용 로컬 그룹에 구성원 추가 Administrators 추가 = 권한 상승
4740 계정 잠김
1102 감사 로그 삭제(보안 로그) 흔적 지우기 강력 의심
7045 (System) 새 서비스 설치 원격 실행 도구·악성 서비스

로그온 유형(Logon Type) — 4624/4625 안의 값

유형 의미
2 대화형(콘솔 직접)
3 네트워크(공유 폴더 접근, SMB) — Pass-the-Hash도 여기
4 배치(예약 작업)
5 서비스
7 잠금 해제
8 NetworkCleartext (평문 자격증명, IIS 기본 인증 등)
10 RemoteInteractive(RDP 원격 데스크톱)
11 캐시된 자격증명

이벤트 로그 읽기 실습

C:\> wevtutil qe Security /q:"*[System[(EventID=4625)]]" /c:3 /rd:true /f:text
Event[0]:
  Log Name: Security
  Event ID: 4625
  Task: Logon
  Description: 계정을 로그온하지 못했습니다.
  ...
  로그온 유형:        3
  실패한 계정 이름:   administrator
  실패 원인:          알 수 없는 사용자 이름 또는 잘못된 암호
  원본 네트워크 주소: 203.0.113.45
PS> Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 200 |
      ForEach-Object { $_.Properties[19].Value } | Group-Object | Sort-Object Count -Descending
Count Name
----- ----
  187 203.0.113.45      ← 한 IP에서 187회 실패 → 무차별 대입 공격
    3 192.168.1.20

5-6. 주요 레지스트리 보안 값 정리

목적 경로 (HKLM\SYSTEM\CurrentControlSet...) 값
기본 공유 제거(서버) Services\LanmanServer\Parameters\AutoShareServer 0
기본 공유 제거(PC) Services\LanmanServer\Parameters\AutoShareWks 0
널 세션 제한 Control\Lsa\RestrictAnonymous 1
SAM 익명 열거 차단 Control\Lsa\RestrictAnonymousSAM 1
LM 해시 저장 안 함 Control\Lsa\NoLMHash 1
NTLMv2만 사용 Control\Lsa\LmCompatibilityLevel 5
LSASS 보호(PPL) Control\Lsa\RunAsPPL 1
WDigest 평문 캐시 금지 Control\SecurityProviders\WDigest\UseLogonCredential 0
C:\> reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
    SecurityHealth    REG_EXPAND_SZ    %windir%\system32\SecurityHealthSystray.exe
    upd               REG_SZ           C:\Users\Public\svch0st.exe   ← ★ 의심

5-7. 패스워드 크래킹

저장된 해시에서 원래 암호를 알아내는 공격. 해시는 되돌릴 수 없으므로(일방향), 후보 암호를 해시해서 비교하는 방식이다.

기법 방법 장점 단점
사전 공격(Dictionary) 자주 쓰는 단어·유출 암호 목록을 차례로 대입 빠름, 현실 암호에 효과적 목록에 없으면 실패
무차별 대입(Brute Force) 가능한 모든 조합 시도 시간만 있으면 반드시 성공 길이·복잡도에 따라 기하급수적 시간
하이브리드 사전 단어 + 변형(숫자·특수문자 추가, p@ssw0rd) 현실적 —
레인보우 테이블 미리 계산한 해시-평문 체인 테이블로 조회 크랙 시점 매우 빠름 (시간-메모리 트레이드오프) 큰 저장 공간, 솔트에 무력
크리덴셜 스터핑 다른 사이트 유출 계정을 그대로 대입(온라인) 암호 재사용 노림 MFA·탐지에 약함
패스워드 스프레잉 많은 계정에 흔한 암호 하나씩(온라인) 계정 잠금 회피 —

솔트(Salt)가 레인보우 테이블을 막는 원리

솔트 없음:  hash("1234")             = 81dc9b...   ← 모든 사용자 동일
           → 미리 계산한 표 한 장으로 모두 크랙

솔트 있음:  hash("x9Q2" + "1234")     = 7a1f0e...   (사용자 A)
           hash("Lm3p" + "1234")     = c42b9d...   (사용자 B)
           → 같은 암호도 해시가 다르고, 솔트마다 표를 새로 만들어야 함

도구

도구 특징
John the Ripper CPU 기반 고전 도구, 다양한 해시 자동 인식. 사전·증분(무차별) 모드. 리눅스 shadow 점검에 전통적으로 사용(unshadow 로 passwd+shadow 결합)
Hashcat GPU 가속 고속 크래커. -m(해시 유형, 예: 0=MD5, 1000=NTLM, 1800=sha512crypt), -a(공격 모드: 0=사전, 3=무차별/마스크)
Ophcrack 레인보우 테이블로 윈도우 LM/NTLM 크랙
Hydra, Medusa 온라인 로그인 무차별 대입(SSH, FTP, HTTP 폼)
# 관리자의 "약한 암호 감사" 개념 예 (자기 시스템, 승인된 범위)
$ john --wordlist=common.txt --format=sha512crypt audit_hashes.txt
...
kim:summer2026       ← 약한 암호 사용자 → 변경 요구
2 password hashes cracked, 18 left

대응: 길고 복잡한 암호(패스프레이즈), 솔트 + 느린 해시, 계정 잠금(온라인 공격 대응), MFA, 해시 파일 접근 통제(shadow 400, SAM 보호), 유출 암호 목록 차단.

5-8. Pass-the-Hash 와 자격증명 탈취 (Mimikatz 개념)

Pass-the-Hash (PtH)

sequenceDiagram
    participant A as 공격자(감염 PC)
    participant L as LSASS 메모리
    participant S as 다른 서버
    A->>L: 1. 관리자 권한으로 자격증명 덤프
    L-->>A: 2. 관리자 NTLM 해시 획득
    A->>S: 3. 해시로 NTLM 인증 응답 생성 (평문 불필요)
    S-->>A: 4. 인증 성공 → 원격 실행·확산

Mimikatz (개념)

대응

대응 효과
일반 업무는 표준 계정, 관리자 권한 최소화 덤프 자체를 어렵게
LAPS(로컬 관리자 암호 솔루션) PC마다 로컬 관리자 암호를 다르게 → 해시 재사용 차단
Credential Guard 가상화 기반 보안(VBS)으로 자격증명 격리
LSA 보호(RunAsPPL) LSASS를 보호 프로세스로 실행
WDigest 비활성(UseLogonCredential=0) 메모리에 평문 암호 미보관
Protected Users 그룹, NTLM 사용 제한 → Kerberos 해시 캐시·NTLM 사용 축소
관리 계층 분리(Tier 모델), 관리 전용 PC(PAW) 도메인 관리자 해시가 일반 PC 메모리에 남지 않게
4624 유형 3 + 4672 이상 패턴 모니터링, EDR 탐지

⚠️ 시험 함정 (Day 5)

기출 포인트 (Day 5)

확인 문제 (Day 5)

Q1. 윈도우 서버에서 재부팅 후에도 C,ADMIN 등 기본 공유가 다시 생성되지 않도록 하는 레지스트리 설정은?
① RestrictAnonymous = 1 ② AutoShareServer = 0 ③ NoLMHash = 1 ④ LmCompatibilityLevel = 5

Q2. 보안 이벤트 로그에서 공격자의 흔적 지우기를 의심할 수 있는 이벤트 ID는?
① 4624 ② 4720 ③ 4740 ④ 1102

Q3. 4625 이벤트를 분석한 결과 로그온 유형이 10으로 기록되어 있었다. 공격자가 시도한 접근 방식은?
① 공유 폴더(SMB) 접근 ② 원격 데스크톱(RDP) 접속 ③ 콘솔 직접 로그온 ④ 서비스 계정 시작

Q4. 레인보우 테이블 공격에 대한 가장 효과적인 대응책은?
① 계정 잠금 임계값 설정 ② 해시 계산 시 사용자별 솔트 추가 ③ 로그인 화면에 마지막 사용자 이름 숨김 ④ 기본 공유 제거

Q5. Pass-the-Hash 공격에 대한 설명으로 옳은 것은?
① 해시를 레인보우 테이블로 크랙해 평문 암호를 얻은 뒤 로그인한다 ② 평문 암호 없이 탈취한 NTLM 해시 자체를 인증에 재사용한다 ③ 솔트가 포함된 리눅스 SHA-512 해시에 주로 사용된다 ④ Kerberos 전용 인증 환경에서만 가능하다

Q6. 윈도우 암호 정책 점검 결과 중 취약으로 판단해야 하는 것은?
① 암호는 복잡성을 만족해야 함: 사용 ② 최대 암호 사용 기간: 90일 ③ 해독 가능한 암호화를 사용하여 암호 저장: 사용 ④ 계정 잠금 임계값: 5


Day 6 · 클라우드·컨테이너 보안 (2027 신규 범위)

2027~2029 출제기준에 새로 명시된 부분. 아직 복원 기출이 거의 없으니 개념 정의와 비교를 정확히 잡는다. 첫 출제는 "용어 정의·책임 구분·도구 용도" 수준일 가능성이 높다.

6-1. 클라우드 서비스 모델과 공동 책임 모델

서비스 모델 — 피자에 비유하면 이해가 빠르다.

공동 책임 모델(Shared Responsibility Model) — "누가 무엇을 지키는가"

             On-Prem   IaaS     PaaS     SaaS
데이터·계정     [고객]   [고객]   [고객]   [고객]  ← 항상 고객
접근권한(IAM)   [고객]   [고객]   [고객]   [고객]
애플리케이션     [고객]   [고객]   [고객]   (CSP)
런타임·미들웨어  [고객]   [고객]   (CSP)    (CSP)
운영체제(OS)    [고객]   [고객]   (CSP)    (CSP)
가상화·하이퍼바이저[고객]  (CSP)    (CSP)    (CSP)
서버·스토리지·망 [고객]   (CSP)    (CSP)    (CSP)
물리 데이터센터  [고객]   (CSP)    (CSP)    (CSP)

[고객] = 클라우드 사용자 책임   (CSP) = 클라우드 공급자 책임
구분 IaaS PaaS SaaS
예 AWS EC2, Azure VM, GCP Compute Engine AWS Elastic Beanstalk, Google App Engine, Heroku Microsoft 365, Google Workspace, Salesforce
사용자가 받는 것 가상 서버·네트워크·스토리지 앱 실행 플랫폼 완성된 소프트웨어
OS 패치 책임 사용자 공급자 공급자
사용자 보안 업무 OS 하드닝·패치, 방화벽(보안 그룹), 미들웨어, 앱, 데이터, IAM 앱 코드 보안, 데이터, IAM, 앱 설정 데이터, 계정·권한, 설정(공유 범위), MFA

6-2. 클라우드 운영체계: 가상화와 하이퍼바이저

가상화: 하나의 물리 서버 위에서 여러 개의 독립된 가상 머신(VM)을 돌리는 기술. 각 VM은 자기만의 게스트 OS 를 가진다. 이를 관리하는 소프트웨어가 하이퍼바이저(VMM, Virtual Machine Monitor).

[Type 1: 베어메탈(네이티브)]        [Type 2: 호스트형]
┌──────┐┌──────┐┌──────┐         ┌──────┐┌──────┐
│ VM1  ││ VM2  ││ VM3  │         │ VM1  ││ VM2  │
│게스트OS││게스트OS││게스트OS│         │게스트OS││게스트OS│
└──────┘└──────┘└──────┘         └──────┘└──────┘
┌──────────────────────┐         ┌──────────────────┐
│  하이퍼바이저           │         │  하이퍼바이저(앱)     │
└──────────────────────┘         ├──────────────────┤
┌──────────────────────┐         │  호스트 OS          │
│  하드웨어               │         ├──────────────────┤
└──────────────────────┘         │  하드웨어            │
                                 └──────────────────┘
구분 Type 1 (베어메탈) Type 2 (호스트형)
위치 하드웨어 위에 직접 호스트 OS 위의 응용 프로그램
예 VMware ESXi, Microsoft Hyper-V, Xen, KVM(리눅스 커널 통합) VMware Workstation, VirtualBox, Parallels
성능 높음(중간 OS 없음) 낮음(호스트 OS 경유)
보안 공격 표면 작음 호스트 OS 취약점도 영향
용도 클라우드·데이터센터 개인 PC 테스트·실습

전가상화 vs 반가상화

가상화 보안 위협

6-3. 컨테이너 vs VM

컨테이너: 앱과 그 실행에 필요한 라이브러리만 묶어(이미지) 호스트 OS의 커널을 공유하며 격리 실행하는 기술(Docker, containerd, Kubernetes가 오케스트레이션).

[가상 머신]                      [컨테이너]
┌─────┐┌─────┐┌─────┐          ┌─────┐┌─────┐┌─────┐
│ App ││ App ││ App │          │ App ││ App ││ App │
│ Lib ││ Lib ││ Lib │          │ Lib ││ Lib ││ Lib │
│GuestOS││GuestOS││GuestOS│      └─────┘└─────┘└─────┘
└─────┘└─────┘└─────┘          ┌──────────────────┐
┌──────────────────┐           │ 컨테이너 런타임      │
│ 하이퍼바이저        │           ├──────────────────┤
├──────────────────┤           │ 호스트 OS (커널 공유) │ ★
│ 하드웨어           │           ├──────────────────┤
└──────────────────┘           │ 하드웨어            │
                               └──────────────────┘
구분 VM 컨테이너
격리 단위 하드웨어 수준(하이퍼바이저) OS(커널) 수준(프로세스 격리)
커널 VM마다 독립 호스트 커널 공유
크기·속도 GB 단위, 부팅 수십 초~분 MB 단위, 시작 수 초 이하
격리 강도 강함 상대적으로 약함 — 커널 취약점 1개로 모든 컨테이너 위험

리눅스 컨테이너 격리 기술

기술 역할
Namespace "보이는 것"을 격리 — PID(프로세스), NET(네트워크), MNT(파일시스템), UTS(호스트명), IPC, USER(UID 매핑)
cgroups "쓸 수 있는 양"을 제한 — CPU, 메모리, I/O (자원 고갈 DoS 방지)
Capabilities root 권한을 잘게 쪼개 필요한 것만 부여(예: CAP_NET_BIND_SERVICE)
seccomp 허용된 시스템 콜만 사용
SELinux/AppArmor 컨테이너 프로세스에 MAC 적용(Day 1)

--privileged 컨테이너의 위험

컨테이너 보안 수칙

6-4. 인스턴스 메타데이터와 IMDSv2

인스턴스 메타데이터 서비스(IMDS)

SSRF → 메타데이터 탈취 흐름

SSRF(Server-Side Request Forgery): 웹 애플리케이션이 사용자가 준 URL로 서버가 대신 요청하는 기능(이미지 URL 미리보기, 웹훅 등)을 악용해, 외부에서 직접 못 가는 내부 주소에 요청하게 만드는 공격.

sequenceDiagram
    participant A as 공격자
    participant W as 웹 앱(EC2 인스턴스)
    participant M as IMDS 169.254.169.254
    participant S as 클라우드 API(스토리지 등)
    A->>W: 1. url=http://169.254.169.254/... 입력
    W->>M: 2. 서버가 대신 메타데이터 요청 (IMDSv1: 단순 GET)
    M-->>W: 3. IAM 역할 임시 자격증명 반환
    W-->>A: 4. 응답 내용을 그대로 공격자에게 표시
    A->>S: 5. 탈취한 자격증명으로 API 호출(데이터 유출)

IMDSv1 vs IMDSv2

구분 IMDSv1 IMDSv2
방식 단순 HTTP GET (요청-응답) 세션 지향: 먼저 PUT 으로 토큰 발급 → 이후 GET 요청 헤더에 토큰 포함
SSRF 내성 약함(URL만 조종하면 됨) 강함 — 대부분의 SSRF는 PUT 메서드·사용자 정의 헤더를 못 만든다
추가 보호 — 응답 홉 제한(TTL, 기본 1) 으로 네트워크 밖·중첩 컨테이너 전달 제한, X-Forwarded-For 포함 요청 거부
# IMDSv2 사용 흐름 (인스턴스 내부에서의 정상 사용 예)
$ TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
    -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
$ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
    http://169.254.169.254/latest/meta-data/instance-id
i-0abc123def4567890
# 토큰 없이 요청 (IMDSv2 필수 설정 시)
$ curl -s -o /dev/null -w "%{http_code}\n" http://169.254.169.254/latest/meta-data/
401

대응

  1. IMDSv2 강제(HttpTokens = required), 필요 없으면 IMDS 비활성.
  2. 애플리케이션 SSRF 방어: 요청 URL 화이트리스트, 내부·링크로컬 IP(169.254.0.0/16, 10.0.0.0/8 등) 차단, 리다이렉트 재검증.
  3. 인스턴스 IAM 역할 최소 권한(탈취돼도 피해 최소화).
  4. user-data에 비밀 정보 넣지 않기.
  5. 클라우드 감사 로그로 비정상 위치에서 자격증명 사용 탐지.

6-5. 클라우드 시스템 정보와 감사 로그

출제기준의 "시스템 정보 – 클라우드 인스턴스 메타데이터·설정·감사 로그"에 해당.

정보 종류 무엇 예
메타데이터 인스턴스 자신의 정보·임시 자격증명 IMDS (6-4)
설정(구성) 정보 리소스 구성 상태·변경 이력 AWS Config, Azure Policy, GCP Cloud Asset Inventory
감사 로그 누가·언제·어디서·어떤 API를·어떤 결과로 호출 AWS CloudTrail, Azure Activity Log(+ Entra ID 로그), GCP Cloud Audit Logs
네트워크 흐름 로그 트래픽 메타데이터 VPC Flow Logs, NSG Flow Logs
OS·앱 로그 인스턴스 내부 로그 CloudWatch Logs, Azure Monitor

CloudTrail 이벤트 예 (개념)

{
  "eventTime": "2026-12-30T02:14:09Z",
  "eventSource": "s3.amazonaws.com",
  "eventName": "PutBucketPolicy",
  "userIdentity": { "type": "IAMUser", "userName": "dev-kim" },
  "sourceIPAddress": "198.51.100.23",
  "requestParameters": { "bucketName": "corp-backup" },
  "responseElements": null
}

→ "dev-kim 이 새벽 2시에 처음 보는 IP에서 백업 버킷 정책을 변경" = 공개 전환 시도 여부 확인 필요.

주목할 이벤트 패턴

감사 로그 보호: 모든 리전 활성화, 별도 보안 계정의 스토리지에 저장, 무결성 검증(다이제스트 파일), 삭제 방지(객체 잠금), SIEM 연동.

6-6. 클라우드·컨테이너 보안 위협: 구성 오류와 과도한 권한

클라우드 사고의 대부분은 공급자 해킹이 아니라 고객의 잘못된 설정(Misconfiguration) 에서 나온다.

유형 사례 대응
공개 스토리지 버킷·블롭을 "퍼블릭 읽기"로 설정 → 개인정보 노출 퍼블릭 액세스 차단(계정 수준), 정책 점검
과도한 네트워크 허용 보안 그룹 0.0.0.0/0 으로 SSH(22)·RDP(3389)·DB(3306) 개방 출발지 IP 제한, 배스천·VPN·세션 관리자
과도한 IAM 권한 정책에 "Action": "*", "Resource": "*", 개발자 계정에 관리자 권한 최소 권한, 역할 기반, 권한 경계, 미사용 권한 정리
root 계정 사용 클라우드 최상위(root) 계정으로 일상 작업, MFA 없음 root 잠금 + MFA, 개별 IAM 사용자/SSO
키 하드코딩·유출 액세스 키를 소스 코드·공개 저장소·이미지에 포함 시크릿 매니저, 임시 자격증명(역할), 키 순환, 시크릿 스캔
로깅 비활성 감사 로그 꺼짐 → 사고 조사 불가 전 리전 감사 로그, 변경 알림
암호화 미적용 디스크·스냅샷·DB 미암호화, 스냅샷 공개 공유 기본 암호화, KMS
컨테이너 privileged, root 실행, docker.sock 마운트, 취약한 이미지, K8s 대시보드 무인증 노출 6-3 수칙, 이미지 스캔
IaC 오류 Terraform·CloudFormation 템플릿에 위 설정이 박혀 대량 복제 IaC 스캔(배포 전 점검)

과도한 권한 예 (IAM 정책)

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "*",            ← 모든 작업
    "Resource": "*"           ← 모든 리소스  → 취약
  }]
}
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:GetObject"],                     ← 필요한 작업만
    "Resource": "arn:aws:s3:::app-assets/*"         ← 필요한 대상만 → 양호
  }]
}

클라우드 보안 솔루션 용어

용어 의미
CSPM (Cloud Security Posture Management) 클라우드 설정 상태를 지속 점검해 구성 오류 탐지 (ScoutSuite가 이 성격)
CWPP (Cloud Workload Protection Platform) VM·컨테이너·서버리스 워크로드 보호 (취약점, 런타임 탐지)
CIEM 클라우드 권한(ID) 관리, 과도한 권한 탐지
CNAPP CSPM + CWPP + CIEM 등을 통합한 플랫폼
CASB 사용자와 SaaS 사이에서 가시성·정책 적용

6-7. Trivy — 컨테이너·IaC 취약점 스캐너

Trivy (Aqua Security, 오픈소스)

$ trivy image --severity HIGH,CRITICAL myapp:1.0

myapp:1.0 (alpine 3.15.0)
==========================
Total: 3 (HIGH: 3, CRITICAL: 0)

┌──────────────┬────────────────┬──────────┬───────────┬───────────┐
│ Library      │ Vulnerability  │ Severity │ Installed │ Fixed     │
├──────────────┼────────────────┼──────────┼───────────┼───────────┤
│ libcrypto1.1 │ CVE-2022-0778  │ HIGH     │ 1.1.1l-r7 │ 1.1.1n-r0 │
│ libssl1.1    │ CVE-2022-0778  │ HIGH     │ 1.1.1l-r7 │ 1.1.1n-r0 │
│ zlib         │ CVE-2018-25032 │ HIGH     │ 1.2.11-r3 │ 1.2.12-r0 │
└──────────────┴────────────────┴──────────┴───────────┴───────────┘
(출력 형식 예시 — 버전·등급은 DB 갱신에 따라 달라질 수 있음)

결과 읽는 법

$ trivy config ./terraform/           # IaC 설정 오류
$ trivy fs --scanners secret ./src     # 소스에 박힌 시크릿
$ trivy image --exit-code 1 --severity CRITICAL myapp:1.0
# → CRITICAL 이 있으면 종료코드 1 → CI 파이프라인 실패 처리
# trivy config 결과 예 (Dockerfile)
Dockerfile (dockerfile)
Tests: 21 (SUCCESSES: 19, FAILURES: 2)
Failures: 2 (HIGH: 1, MEDIUM: 1)

HIGH: Specify at least 1 USER command in Dockerfile with non-root user
MEDIUM: Specify a tag in the 'FROM' statement for image 'ubuntu'

→ 컨테이너가 root로 실행되는 설정, latest 태그 사용 지적.

6-8. ScoutSuite — 멀티 클라우드 보안 감사 도구

ScoutSuite (NCC Group, 오픈소스, Python)

$ scout aws --profile audit-readonly
[...] Fetching resources for the IAM service
[...] Fetching resources for the EC2 service
[...] Fetching resources for the S3 service
...
[...] Saving data to scoutsuite-report/scoutsuite-results/...
[...] Report: scoutsuite-report/aws-audit-readonly.html

보고서에서 보이는 항목 예

서비스 발견 항목(예) 위험도
IAM Root account without MFA 위험
IAM Users with AdministratorAccess / Inline policy *:* 위험
EC2 Security group allows 0.0.0.0/0 on port 22 위험
S3 Bucket world-readable / 암호화 없음 / 로깅 없음 위험·경고
CloudTrail Not enabled in all regions 경고

도구 비교

도구 대상 주 용도 비유
Nmap 네트워크·호스트 열린 포트·서비스·OS 탐지 건물 바깥에서 열린 창문 세기
Trivy 컨테이너 이미지·IaC·파일시스템 CVE·설정 오류·시크릿 상자(이미지) 속 부품 검사
ScoutSuite 클라우드 계정(API) 구성 오류·과도한 권한 감사 건물 관리 규정 준수 점검
Tripwire/AIDE 호스트 파일 무결성(변조) 탐지 봉인 스티커 확인

⚠️ 시험 함정 (Day 6)

기출 포인트 (Day 6) — 예상

확인 문제 (Day 6)

Q1. 클라우드 공동 책임 모델에서 IaaS 환경의 고객 책임에 해당하지 않는 것은?
① 게스트 OS 보안 패치 ② 보안 그룹(가상 방화벽) 규칙 설정 ③ 하이퍼바이저 취약점 패치 ④ 저장 데이터 암호화

Q2. 다음 중 Type 2(호스트형) 하이퍼바이저에 해당하는 것은?
① VMware ESXi ② Xen ③ Oracle VirtualBox ④ Microsoft Hyper-V

Q3. 컨테이너 보안에 대한 설명으로 옳지 않은 것은?
① 컨테이너는 호스트 커널을 공유하므로 커널 취약점의 영향을 받는다 ② cgroups는 컨테이너의 CPU·메모리 사용량을 제한한다 ③ --privileged 옵션은 컨테이너의 권한을 최소화해 탈출 위험을 줄인다 ④ 컨테이너는 root가 아닌 사용자로 실행하는 것이 권장된다

Q4. 웹 애플리케이션의 SSRF 취약점을 이용해 클라우드 인스턴스의 IAM 임시 자격증명이 유출되었다. 인스턴스 측에서 가장 직접적인 재발 방지 조치는?
① 인스턴스의 디스크 암호화 ② IMDSv2(세션 토큰 필수) 적용 ③ 인스턴스 유형을 더 큰 사양으로 변경 ④ 웹 서버의 로그 보관 기간 연장

Q5. 클라우드 환경에서 "누가, 언제, 어떤 API를 호출했는지"를 기록하는 서비스는?
① VPC Flow Logs ② AWS CloudTrail ③ 인스턴스 메타데이터 서비스 ④ 컨테이너 레지스트리

Q6. 도구와 주된 용도의 연결로 옳지 않은 것은?
① Trivy – 컨테이너 이미지의 알려진 취약점(CVE) 스캔 ② ScoutSuite – 멀티 클라우드 계정의 보안 설정 감사 ③ Nmap – 대상 호스트의 열린 포트와 서비스 탐지 ④ ScoutSuite – 실행 중인 컨테이너 내부 메모리의 악성코드 분석


Day 7 · 주간 정리

7-1. 한 장 총정리

Day 1 운영체제 · 보안 OS

Day 2 메모리 공격

Day 3 악성코드 · 사회공학

Day 4 리눅스 점검 · Nmap

Day 5 윈도우

Day 6 클라우드 · 컨테이너

7-2. 헷갈리는 쌍 비교 모음

헷갈리는 쌍 구분 포인트
참조 모니터 vs 보안 커널 개념 vs 구현
Stack Guard vs Stack Shield 카나리 vs RET 사본
ASLR vs DEP 주소 랜덤 vs 실행 금지
mktemp vs mkstemp 이름만 vs 안전 생성
바이러스 vs 웜 숙주 필요 vs 독립 전파
피싱 vs 파밍 링크 클릭 vs 정상 주소 입력
스피어 피싱 vs 웨일링 특정인 vs 고위층
정적 vs 동적 분석 실행 X vs 실행 O
EPP vs EDR 예방 vs 탐지·대응
사용자 vs 커널 루트킷 바이너리 교체 vs 커널 후킹
SYN vs Connect 스캔 반만 연결 vs 완전 연결
AutoShareServer vs RestrictAnonymous 기본 공유 vs 널 세션
레인보우 테이블 vs PtH 해시 → 평문(크랙) vs 해시 그대로 사용
Type 1 vs Type 2 하드웨어 위 vs 호스트 OS 위
Namespace vs cgroups 격리 vs 자원 제한
Trivy vs ScoutSuite 이미지·코드 vs 클라우드 계정 설정

7-3. 미니 모의고사 (20문항)

시간 재고 풀기: 20분. 다 푼 뒤 정답을 펼친다. 틀린 문제는 아래 오답 노트에 기록.

M1. 참조 모니터를 실제로 구현한 하드웨어·펌웨어·소프트웨어를 무엇이라 하는가?
① TCB ② 보안 커널 ③ 보안 경계 ④ 신뢰 경로

M2. TCSEC에서 개별 사용자 책임 추적을 위한 감사(Audit) 기능이 처음 요구되는 등급은?
① C1 ② C2 ③ B1 ④ B2

M3. CC(공통평가기준)에 대한 설명으로 옳지 않은 것은?
① 국제 표준 ISO/IEC 15408이다 ② 보증 등급은 EAL1~EAL7이다 ③ ST는 제품 유형별로 구현 독립적인 요구사항을 정의한다 ④ TOE는 평가 대상 제품이다

M4. 다음 중 버퍼 오버플로에 취약한 함수와 대체 함수의 연결이 옳지 않은 것은?
① strcpy – strncpy ② gets – fgets ③ sprintf – snprintf ④ fgets – gets

M5. 지역 변수와 리턴 주소 사이에 임의의 값을 두고 함수 종료 전에 변경 여부를 검사하는 기법은?
① ASLR ② NX bit ③ Stack Canary ④ RELRO

M6. 메모리의 스택·힙 영역에 있는 코드의 실행을 막는 기법을 우회하기 위해 기존 코드 조각(가젯)을 연결해 실행 흐름을 만드는 기법은?
① ROP ② NOP sled ③ 힙 스프레이 ④ 포맷 스트링

M7. 포맷 스트링 공격에서 지금까지 출력된 바이트 수를 지정된 주소에 기록해 메모리 변조에 사용되는 지정자는?
① %x ② %s ③ %d ④ %n

M8. 임시 파일 생성과 사용 사이의 시간 차를 이용해 심볼릭 링크로 다른 파일을 덮어쓰게 하는 공격은?
① 정수 오버플로 ② 레이스 컨디션 ③ 힙 스프레이 ④ 사전 공격

M9. 다음 중 자기 복제 기능이 없는 악성코드는?
① 웜 ② 매크로 바이러스 ③ 트로이목마 ④ 부트 바이러스

M10. 감염 사실을 숨기기 위해 파일 크기나 날짜를 감염 전 정보로 보여 주는 바이러스 세대는?
① 원시형 ② 암호형 ③ 은폐형 ④ 매크로

M11. 특정 집단이 자주 방문하는 웹사이트를 미리 감염시켜 방문자를 공격하는 기법은?
① 파밍 ② 워터링 홀 ③ 스미싱 ④ 웨일링

M12. 악성코드를 실행하지 않고 문자열, PE 헤더, 디스어셈블 코드를 통해 분석하는 방법은?
① 동적 분석 ② 샌드박스 분석 ③ 정적 분석 ④ 행위 분석

M13. 리눅스에서 SSH를 통한 root 직접 로그인을 막기 위한 sshd_config 설정은?
① PermitEmptyPasswords no ② PermitRootLogin no ③ PasswordAuthentication yes ④ UsePAM no

M14. TCP Wrapper에서 hosts.allow 와 hosts.deny 어디에도 매칭되지 않은 접속의 처리는?
① 거부된다 ② 허용된다 ③ 로그만 남기고 거부된다 ④ 관리자 승인 대기

M15. umask 가 077 일 때 새로 생성되는 디렉터리의 권한은?
① 700 ② 600 ③ 755 ④ 644

M16. Nmap 스캔 중 3-way handshake를 완료하지 않고 SYN/ACK 수신 시 RST를 보내 연결을 끊는 방식은?
① -sT ② -sS ③ -sU ④ -sA

M17. 윈도우에서 익명 사용자(널 세션)의 SAM 계정·공유 열거를 제한하는 레지스트리 값은?
① AutoShareWks ② RestrictAnonymous ③ NoLMHash ④ UseLogonCredential

M18. 탈취한 NTLM 해시를 크랙하지 않고 그대로 인증에 사용하는 공격은?
① 레인보우 테이블 공격 ② Pass-the-Hash ③ 크리덴셜 스터핑 ④ 패스워드 스프레잉

M19. 컨테이너 격리 기술 중 프로세스·네트워크·마운트 등 "보이는 범위"를 분리하는 것은?
① cgroups ② Namespace ③ seccomp ④ Capabilities

M20. 클라우드 인스턴스 메타데이터 서비스에 대한 설명으로 옳지 않은 것은?
① 인스턴스 내부에서 169.254.169.254 로 접근한다 ② IAM 역할의 임시 자격증명이 포함될 수 있다 ③ IMDSv2는 PUT으로 발급받은 세션 토큰을 요구한다 ④ IMDSv2를 적용하면 SSRF 취약점 자체가 웹 애플리케이션에서 제거된다

7-4. 카드

오답 노트


네비게이션

이전 다음
◀ Week07_네트워크 보안 Week09_어플리케이션 보안 ▶